我在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
答案 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?