2016-12-03 58 views
0

我工作在Microsoft SQL Server中的触发器2012SQL服务器不接受正确的语法上的触发

这里是我到目前为止,以下我所知道的是正确的语法:

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 Server正在抛出一个错误,其中'of'和OldRow中的所有值都要插入到dbo.Lead中。

+0

您只能将OF关键字与INSTEAD一起使用。 https://msdn.microsoft.com/en-us/library/ms189799.aspx –

+2

对于SQL Server中的触发器,这是*** NOT ***正确的语法 - 简单明了。 SQL Server没有**有一个'FOR EACH ROW'子句,T-SQL不支持'在删除......之后' - 而T-SQL不支持' OLD'或'NEW'关键字 - 您需要阅读[**官方MSDN文档**](https://msdn.microsoft.com/zh-cn/library/ms189799.aspx)关于T的确切触发语法-SQL! –

+0

@marc_s这是我的教授教给我的语法。如果我想要像这样运行触发器,我该怎么办?我能举个例子吗?我之前正在查看文档,我无法理解它。 –

回答

1

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

如果你想“拯救”旧值(正在删除),您可以使用此代码:

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伪表中获取所有的行,并插入这些值到目标表 - 这将处理多行删除,太(如果你的语句删除20行)

但我不明白为什么你会想INSERT删除的行回从他们被删除的表......什么的这样做的目的?通常情况下,你宁愿被保存了这些值转换成一个审计表什么的.....

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

+0

是的,我意识到这个触发器有点微不足道,并没有真正的实际应用。我被要求为数据库编写任何类型的触发器。这是我能够想到的第一件事情,它不需要创建一个新表来保存一些计算出来的价值/统计数据。 –