SQL触发器在插入时将新记录添加到具有相同结构的表中

时间:2015-01-09 16:20:57

标签: sql sql-server tsql triggers sql-server-2012

我正在尝试创建SQL触发器,它将新记录添加到通过网页进行插入的同一个表中。我不确定如何实现它,但我尝试了以下查询

CREATE trigger [dbo].[trgI_DealsDoneInserRecord]
on [dbo].[Terms]
after insert 
As    
  Insert into DealsDone                
        (Company,Grade,Term,Pipeline,[Index],Volume,Price,[Type],CounterParty,
               TermID,GradeID,CPID,Locked,Product)
  VALUES 
        (SELECT Company,Grade,Term,Pipeline,[Index],Volume,Price,[Type],CounterParty,
           TermID,GradeID,CPID,Locked,Product FROM inserted)

END

上述查询在SELECT中的VALUES语句中引发了错误。

我可以知道实现此方法吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

CREATE trigger [dbo].[trgI_DealsDoneInserRecord]
ON [dbo].[Terms]
AFTER INSERT 
As    
BEGIN
  INSERT INTO DealsDone                
        (Company,Grade,Term,Pipeline,[Index],Volume,Price,[Type],CounterParty,
               TermID,GradeID,CPID,Locked,Product)
  SELECT Company,Grade,Term,Pipeline,[Index],Volume,Price,[Type],CounterParty,
           TermID,GradeID,CPID,Locked,Product FROM inserted
END

答案 1 :(得分:1)

虽然我一般主张使用SELECT * 反对,但在这种情况下,这似乎是一个好处:

  • 如果您不添加或删除甚至重命名字段,则无需指定字段即可自动考虑表中的更改,而无需更新此触发器。

  • 如果其中一个表更新但另一个表不是并且结构不同,这将帮助您捕获模式更新中的错误。如果发生这种情况,INSERT操作将失败,您不必担心清理不良数据。

所以使用这个:

CREATE TRIGGER [dbo].[trgI_DealsDoneInserRecord]
ON [dbo].[Terms]
AFTER INSERT
AS
  SET NOCOUNT ON;

  INSERT INTO [DealsDone]
      SELECT *
      FROM inserted;

答案 2 :(得分:0)

存在语法问题,您也缺少BEGIN

基本语法是

INSERT INTO table2  (column_name(s))
SELECT column_name(s)
FROM table1;

所以试试这个

    CREATE trigger [dbo].[trgI_DealsDoneInserRecord]
    on [dbo].[Terms]
    after insert 
    As
   BEGIN
       Insert into DealsDone                
          (Company,Grade,Term,Pipeline,[Index],Volume,Price,[Type],CounterParty,
                  TermID,GradeID,CPID,Locked,Product)
       SELECT Company,Grade,Term,Pipeline,[Index],Volume,Price,[Type],CounterParty,
                  TermID,GradeID,CPID,Locked,Product 
        FROM inserted
    END

参考: - http://technet.microsoft.com/en-us/library/ms188263(v=sql.105).aspx