/* 更新的觸發器 */
create trigger add_date
on students
在update之后
as
更新學生
set dtModify = getdate()
where id = (select id from inserted)
/* 插入的觸發器 */
create trigger add_date_insert
on students
在insert之后
as
update students
set dtEnter = getdate()
where id = (select id from inserted)
uj5u.com熱心網友回復:
首先--對于INSERT--我會使用一個帶有默認約束的DATETIME2(3)列--那么你就不需要一個觸發器:
CREATE TABLE dbo.Students
(
//你的列在這里
dtEnter DATETIME2(3)
CONSTRAINT DF_Students_dtEnter DEFAULT (SYSDATETIME()
)
現在,每次你插入一行時,如果你沒有在你要插入值的列串列中指定dtEnter列--它將被SQL Server自動設定:
INSERT INTO dbo. (list-of-columns-WITHOUT-dtEnter)
VALUES (list-of-values)
對于更新,你需要使用一個觸發器--不能使用默認的約束來實作。使用這個觸發器--確保處理Inserted可能包含多條記錄的事實!
CREATE TRIGGER add_date
ON dbo.Students
AFTER UPDATE
AS
UPDATE dbo.students
SET dtModify = SYSDATETIME()
WHERE id IN (SELECT id FROM Inserted)
uj5u.com熱心網友回復:
如果你被inserted所迷惑,那么沒有什么可擔心的。這個表有插入的行,觸發器是在這個表上觸發的。
現在,在SQL Server中只有兩個這樣的表 inserted 和 deleted
- 在插入的情況下
- 在插入的情況下,
inserted有插入的行。 - 在洗掉的情況下,
deleted有被洗掉的行。 。
- 在更新的情況下,有關的行首先被洗掉,因此被放在
deleted中,然后新的行被插入更新的資料,你可以在inserted表中找到。因此,你可能認為更新是一個單一的操作,而實際上它是洗掉和插入兩個操作的組合。
如果你希望你的觸發器只在更新的情況下運行邏輯,你可以像這樣設定一個IF檢查:
If exists (Select * from插入) and exists(Select * from deleted)
并將你的觸發邏輯放在這個區塊內,就像這樣
。如果exists (Select * from插入) and exists(Select *from deleted)
BEGIN
--更新邏輯。
結束
如果存在(選擇 * 來自插入)and not exists(Select * from deleted)
BEGIN
--內嵌邏輯。
END
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332782.html
標籤:
下一篇:當前瀏覽器版本不支持機器人框架
