2015-12-28 28 views

回答

0

試試這個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 
+0

這是一個分配的問題,我們必須使用觸發器 –

+0

所以,在這種情況下使用的,而不是觸發和觸發的身體檢查你的課程日期。 – fabulaspb

+0

是的,這就是問題,我該怎麼做?因爲我不知道觸發器知識 –

-1
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 
+0

你的觸發器有** **主要中的缺陷,你似乎認爲它會被稱爲**每行一次** - 這是** **沒有的情況。該觸發條件會**每一次聲明**,所以,如果你的'INSERT'報表影響25行,你會被開除的觸發** **一次,但隨後'Inserted'將包含25行。那25行中你的代碼會在這裏選擇? 'SELECT @Date = i.DateofStart FROM Inserted i;' - 它是非確定性的 - 一個獲得**一個任意的行**,並且你忽略所有其他的。你需要重寫你的觸發器來考慮這個問題! –

+0

是mySql中接受的這段代碼嗎? –

+1

@MaryamMoeini:你使用MySQL嗎?那麼你應該**相應地標記你的問題**! –

0

查看本網站給出的例子寫觸發 https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm#i1025109

第1步:既然你需要檢查的課程八月期間不能運行,你會需要BEFORE INSERT觸發器類型(檢查鏈接的語法)

第2步:寫在Tr的邏輯igger體將檢查在表

第3步所輸入的日期:如果DateofStart是在八月拋出一個異常或進行相應的處理

會嘗試共享的代碼片段。