SQL Server 2005'INSTEAD OF'DELETE触发器 - 不删除源记录

时间:2014-09-17 19:13:57

标签: sql sql-server sql-server-2005 database-trigger

我在SQL Server 2005中创建了一个触发器,只要在源表中发生删除,就会将记录插入到历史记录表中。记录将被插入,但它们不会从源表中删除。

这是我的触发器:

CREATE TRIGGER TRG_EdiHistory 
ON  dbo.EDI10000 
INSTEAD OF DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    SET IDENTITY_INSERT dbo.EDI10500 ON;

    INSERT INTO EDI10500(File_Id, Tp_Id, File_Name, File_Size, File_Data, Rec_Date, Content_Type, Update_Flag)
       SELECT 
          File_Id, Tp_Id, File_Name, File_Size, File_Data,
          Rec_Date, Content_Type, Update_Flag
       FROM 
          DELETED   
END
GO

我必须使用INSTEAD OF触发器,因为我的表包含Image类型列。

如果有人知道为什么会这样,请。

谢谢。

*更新*

CREATE TRIGGER TRG_EdiHistory 
ON  dbo.EDI10000 
INSTEAD OF DELETE
AS 
BEGIN
   SET NOCOUNT ON;

   SET IDENTITY_INSERT dbo.EDI10500 ON;

    INSERT INTO EDI10500 ([File_Id],Tp_Id,[File_Name],File_Size
                            ,File_Data,Rec_Date,Content_Type,Update_Flag)
    SELECT   [File_Id], Tp_Id, [File_Name], File_Size, File_Data,
          Rec_Date, Content_Type, Update_Flag
    FROM DELETED    

    DELETE FROM dbo.EDI10000
    WHERE EXISTS (SELECT 1 
                  FROM DELETED
                  WHERE [FILE_ID] = dbo.EDI10000.[File_Id])

END
GO

2 个答案:

答案 0 :(得分:1)

而不是触发器,而不是触发动作。在您的案例中,而不是触发器触发并将数据插入到历史记录表中。

请注意,触发此触发器而不是“删除”命令。因此,如果您还想删除行,则需要在此触发器中添加Delete语句。

说完这个后,我想而不是Instead Trigger如果你只是定义一个与你的定义相同的After Trigger而不是触发器会使事情变得非常简单。它将从表中删除行,然后将行插入到历史表中,因为您希望它能够正常工作。

更新

由于您已经提到过您无法在sql server 2005中的After Trigger内使用图像数据类型,因此我不知道此限制。那么在这种情况下,你只需在你现有的而不是触发器中添加一个删除语句。

DELETE FROM dbo.table
WHERE EXISTS (SELECT 1 
              FROM deleted 
              WHERE Pk_Column = table.PK_Column)

答案 1 :(得分:0)

而不是删除替换DELETE语句的标准操作。

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

看看这里如何做你真正想要的事情: How to create a before delete trigger in SQL Server?