0

我在 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
4

2 回答 2

1

代替 Triggers , fire 代替触发动作。在您的情况下,这不是 Trigger 触发并将数据插入您的历史记录表。

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

话虽如此,我认为Instead Trigger如果您简单地定义After Trigger与您的 this 定义相同的定义而不是触发器,那么事情会变得非常简单。它将从表中删除行,然后将行插入到您的历史表中,因为您期望它可以工作。

更新

既然你提到你不能After Trigger在 sql server 2005 中使用图像数据类型,我不知道这个限制。那么在这种情况下,您可以简单地在现有的而不是触发器中添加一个删除语句。

DELETE FROM dbo.table
WHERE EXISTS (SELECT 1 
              FROM deleted 
              WHERE Pk_Column = table.PK_Column)
于 2014-09-17T19:21:40.027 回答
0

而不是 delete 替换了 DELETE 语句的标准操作。

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

看看这里如何做你真正想做的事: 如何在 SQL Server 中创建删除前触发器?

于 2014-09-17T19:18:18.223 回答