SQL 服务器不接受触发器的正确​​语法

SQL Server not accepting correct syntax on trigger

我正在 Microsoft SQL Server 2012

中开发触发器

这是我目前所知道的,遵循我所知道的正确语法:

CREATE TRIGGER restore_trigger
ON dbo.Lead 
AFTER DELETE OF id, firsname, lastname, postalcode, address,phone, email, title, managementlevel, lastcalldate, lastcallresult, companyid
REFERENCING OLD ROW as OldRow 
FOR EACH ROW
     INSERT INTO dbo.Lead 
     VALUES (OldRow.id, OldRow.firstname, OldRow.lastname, OldRow.postalcode, OldRow.address, OldRow.phone, OldRow.email,
OldRow.title, OldRow.managmentlevel, OldRow.lastcalldate, OldRow.lastcallresult, OldRow.companyid);

Microsoft SQL 服务器抛出错误 'of' 以及我想插入到 dbo.Lead.

的 OldRow 中的所有值

正如我所说 - 当涉及到 T-SQL 触发器时,您当前的代码充满了语法和逻辑错误。

如果您想 "save" 旧值(正在删除),您可以使用此代码:

CREATE TRIGGER restore_trigger
ON dbo.Lead 
AFTER DELETE  
AS
    INSERT INTO dbo.Lead (id, firstname, lastname, postalcode, address, phone, email, title, managmentlevel, lastcalldate, lastcallresult, companyid)
        SELECT 
            id, firstname, lastname, postalcode, address, phone, email, title, managmentlevel, lastcalldate, lastcallresult,  companyid
        FROM
            Deleted;

通知:

  • 我建议 始终 指定要插入的列 - 无一例外。
  • 您只需要一个 SELECT 语句从 Deleted 伪 table 获取所有行并将这些值插入目标 table - 这也将处理 多行 删除(如果您的语句删除 20 行)

但我不清楚您为什么要 INSERT 已删除的行返回到 table 中,它们正从中被删除.... .. 这样做的目的是什么??通常,您更愿意将这些值存储到 Audit table 或其他内容中......

如果您想基本上撤消 DELETE 的影响 - 为什么不只是 防止 DELETE 首先,通过从那些不允许删除的用户那里删除 table 的删除权限?....似乎更有效 prevent 不需要的操作,而不是在触发器中撤消它....