找出使用触发器插入,更新或删除的行

时间:2014-08-13 06:21:47

标签: sql-server tsql

这是我关于stackoverflow的第一个问题,我希望你们能帮助我。

我在数据库中有一个名为indication的表,它有三列Name,Age,Enable。

我想创建一个触发器,只要年龄小于18且启用为真,就会在我的闹钟表中插入一个警报,我想在指示表的确切时刻检查记录表,就像我一样可以检查是否应该插入警报。

我在MSDN上找到了“COLUMNS_UPDATED(Transact-SQL)”并且它适用于更新的列,ROWS_UPDATED有同样的事情吗?

2 个答案:

答案 0 :(得分:1)

您始终可以设置触发器,仅使用

响应INSERT操作
CREATE TRIGGER TR_Whatever_I ON dbo.YourTable FOR INSERT
AS
... (body of trigger)

请注意FOR INSERTAFTER 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中,触发器每操作触发一次,而不是每一次。这意味着InsertedDeleted元表在触发器执行期间将包含尽可能多的行,因为存在受操作影响的行。小心,不要写假设只有一行的触发器。

答案 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将始终拥有insertedUpdate将始终拥有inserted表和deletedDelete将始终拥有deleted

inserted表基本上是应用于表的所有new记录,deleted表包含将被删除的所有记录。对于UPDATE事件,inserted表将包含所有新值,deleted将包含所有旧值。

如果使用不当,触发器会严重影响性能,因此请谨慎使用。