我有一個表叫COURSE
這些列:使用觸發器來過濾特定日期
CourseId int
CourseName varchar
DateofStart Date
我想創建一個觸發器,它確保了課程不能在八月份進行。
我有一個表叫COURSE
這些列:使用觸發器來過濾特定日期
CourseId int
CourseName varchar
DateofStart Date
我想創建一個觸發器,它確保了課程不能在八月份進行。
試試這個SQL代碼(SQL Server)的
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER Tr_Course
ON Course
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF TRIGGER_NESTLEVEL() > 1
RETURN
UPDATE Course
SET dateOfStart = I.dateOfStart
FROM Course AS C
JOIN INSERTED I ON C.courseID = I.courseID
WHERE MONTH(I.dateOfStart) <> 8
END
GO
這是一個分配的問題,我們必須使用觸發器 –
所以,在這種情況下使用的,而不是觸發和觸發的身體檢查你的課程日期。 – fabulaspb
是的,這就是問題,我該怎麼做?因爲我不知道觸發器知識 –
create trigger check_month
on COURSE
for Insert
as
declare @Date nvarchar(10)
declare @month int
select @Date=i.DateofStart from inserted i;
set @month= (select DATEPART(MONTH,@Date))
if(@month=8)
begin
Rollback
end
else
begin
commit
end
你的觸發器有** **主要中的缺陷,你似乎認爲它會被稱爲**每行一次** - 這是** **沒有的情況。該觸發條件會**每一次聲明**,所以,如果你的'INSERT'報表影響25行,你會被開除的觸發** **一次,但隨後'Inserted'將包含25行。那25行中你的代碼會在這裏選擇? 'SELECT @Date = i.DateofStart FROM Inserted i;' - 它是非確定性的 - 一個獲得**一個任意的行**,並且你忽略所有其他的。你需要重寫你的觸發器來考慮這個問題! –
是mySql中接受的這段代碼嗎? –
@MaryamMoeini:你使用MySQL嗎?那麼你應該**相應地標記你的問題**! –
查看本網站給出的例子寫觸發 https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm#i1025109
第1步:既然你需要檢查的課程八月期間不能運行,你會需要BEFORE INSERT觸發器類型(檢查鏈接的語法)
第2步:寫在Tr的邏輯igger體將檢查在表
第3步所輸入的日期:如果DateofStart是在八月拋出一個異常或進行相應的處理
會嘗試共享的代碼片段。
請標記RDBMS名。 SQL Server,MySQL .. ?? – pedram