这是我关于stackoverflow的第一个问题,我希望你们能帮助我。
我在数据库中有一个名为indication的表,它有三列Name,Age,Enable。
我想创建一个触发器,只要年龄小于18且启用为真,就会在我的闹钟表中插入一个警报,我想在指示表的确切时刻检查记录表,就像我一样可以检查是否应该插入警报。
我在MSDN上找到了“COLUMNS_UPDATED(Transact-SQL)”并且它适用于更新的列,ROWS_UPDATED有同样的事情吗?
答案 0 :(得分:1)
您始终可以设置触发器,仅使用
响应INSERT
操作
CREATE TRIGGER TR_Whatever_I ON dbo.YourTable FOR INSERT
AS
... (body of trigger)
请注意FOR INSERT
与AFTER INSERT
相同。您还可以选择INSTEAD OF
,但必须自己执行数据修改。 SQL Server中没有BEFORE
触发器。
在某些情况下,一次处理多个操作非常方便,因为不同操作的脚本是相似的 - 为什么在只编写一个时写入三个触发器?因此,如果您的触发器看起来更像这样:
CREATE TRIGGER TR_Whatever_IUD ON dbo.YourTable FOR INSERT, UPDATE, DELETE
AS
... (body of trigger)
然后你不会自动知道它是身体中的插入物。在这种情况下,您可以检测它是否是类似于此的插入:
IF EXISTS (SELECT * FROM Inserted)
AND NOT EXISTS (SELECT * FROM Deleted) BEGIN
--It's an INSERT.
END
或者,如果您想确定它是三个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
;
如果DML操作不影响任何行(例如,UPDATE dbo.YourTable SET Column = '' WHERE 1 = 0
),则触发器仍会运行。在这种情况下,您无法判断它是更新,删除还是插入 - 但由于未进行任何修改,因此无关紧要。
特别提示
值得一提的是,在SQL Server中,触发器每操作触发一次,而不是每行一次。这意味着Inserted
和Deleted
元表在触发器执行期间将包含尽可能多的行,因为存在受操作影响的行。小心,不要写假设只有一行的触发器。
答案 1 :(得分:0)
首先,我认为你必须增加你对触发器工作方式的了解,以及不同类型的触发器是什么。
你可以像这样创建一个触发器
CREATE TRIGGER trg_Indication_Ins
ON Indication
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
Insert Alarms (column1, column2) Select value1, value2 from inserted where Age < 18 and Enable = 1
END
这应该基本上可以满足您的需求,也可以根据您对您的问题的理解。
<强>更新强>
基本上触发器可以在INSERT,UPDATE或DELETE或三者的任意组合上触发,您也可以将其设置为在事件之前,事件之后或事件的INSTEAD之前触发。根据事件,触发器将始终具有1或2个“内部”表格,例如:
Insert
将始终拥有inserted
表
Update
将始终拥有inserted
表和deleted
表
Delete
将始终拥有deleted
表
inserted
表基本上是应用于表的所有new
记录,deleted
表包含将被删除的所有记录。对于UPDATE
事件,inserted
表将包含所有新值,deleted
将包含所有旧值。
如果使用不当,触发器会严重影响性能,因此请谨慎使用。