我在数据库中有一个名为指示的表,它具有三列Name、Age和Enable。
我想创建一个触发器,只要Age低于 18 并且Enable为真,就会将警报插入到我的警报表中,我想在插入的那一刻检查指示表上的记录,这样我就可以检查它是否应插入报警或不报警。
我COLUMNS_UPDATED (Transact-SQL)在 MSDN 上发现它适用于更新的专栏,有同样的事情吗ROWS_UPDATED?
您始终可以将触发器设置为仅响应某个INSERT操作,
CREATE TRIGGER TR_Whatever_I ON dbo.YourTable FOR INSERT
AS
... (body of trigger)
Run Code Online (Sandbox Code Playgroud)
请注意FOR INSERT与 相同AFTER INSERT。您还可以选择INSTEAD OF,但您必须自己执行数据修改。BEFORESQL Server 中没有触发器。
在某些情况下,一次处理多个操作非常方便,因为不同操作的脚本是相似的——当您只能编写一个触发器时,为什么要编写三个触发器呢?因此,在您的触发器看起来更像这样的情况下:
CREATE TRIGGER TR_Whatever_IUD ON dbo.YourTable FOR INSERT, UPDATE, DELETE
AS
... (body of trigger)
Run Code Online (Sandbox Code Playgroud)
那么你不会自动知道它是体内的插入物。在这种情况下,你可以检测是否是类似于这样的插入:
IF EXISTS (SELECT * FROM Inserted)
AND NOT EXISTS (SELECT * FROM Deleted) BEGIN
--It's an INSERT.
END
Run Code Online (Sandbox Code Playgroud)
或者,如果您想确定它是三个 DML 操作中的哪一个:
DECLARE @DataOperation char(1);
SET @DataOperation =
CASE
WHEN NOT EXISTS (SELECT * FROM Inserted) THEN 'D'
WHEN NOT EXISTS (SELECT * FROM Deleted) THEN 'I'
ELSE 'U'
END
;
Run Code Online (Sandbox Code Playgroud)
如果 DML 操作不影响任何行,触发器仍会运行(例如,UPDATE dbo.YourTable SET Column = '' WHERE 1 = 0)。在这种情况下,您无法判断它是更新、删除还是插入——但由于没有发生修改,所以这并不重要。
特别说明
值得一提的是,在 SQL Server 中,触发器每个操作触发一次,而不是每行触发一次。这意味着在触发器执行期间,Inserted元Deleted表中的行数将与受操作影响的行数一样多。请小心,不要编写假设只有一行的触发器。
| 归档时间: |
|
| 查看次数: |
1766 次 |
| 最近记录: |