Hello可以在Trigger Body上的DML命令/操作(插入,删除,更新)之间切换吗?我尝试将一些T-SQL代码片段以便更好地理解我:
CREATE TRIGGER DML_ON_TABLEA
ON TABLEA
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
CASE
WHEN (INSERT) THEN
-- INSERT ON AUX TABLEB
WHEN (DELETE) THEN
-- DELETE ON AUX TABLEB
ELSE --OR WHEN (UPDATE) THEN
-- UPDATE ON AUX TABLEB
END
END
GO
谢谢,
答案 0 :(得分:19)
我将向您展示一种在SQL Server 2000或2005中检查此问题的简单方法(您忘记提及您正在使用的版本),但总的来说我同意Remus您应该将它们分解为单独的触发器:
DECLARE @i INT, @d INT;
SELECT @i = COUNT(*) FROM inserted;
SELECT @d = COUNT(*) FROM deleted;
IF @i + @d > 0
BEGIN
IF @i > 0 AND @d = 0
BEGIN
-- logic for insert
END
IF @i > 0 AND @d > 0
BEGIN
-- logic for update
END
IF @i = 0 AND @d > 0
BEGIN
-- logic for delete
END
END
请注意,由于SQL Server 2008中引入的复杂性MERGE
,这可能无法完全向前兼容。有关详细信息,请参阅此Connect项:
因此,如果您计划将来使用SQL Server 2008和MERGE
,那么更有理由将触发器拆分为每种类型的DML操作的触发器。
(如果您想要更多理由避免MERGE
,read this。)
答案 1 :(得分:7)
您可以使用inserted
and deleted
tables查看对表格所做的更改。
对于UPDATE,deleted
表包含旧版本的行,inserted
包含新版本。
DELETE和INSERT使用他们自己的表格。
答案 2 :(得分:6)
您可以有三个单独的触发器,一个用于INSERT,一个用于UPDATE,一个用于DELETE。由于每个触发器都不同,因此不需要切换逻辑。
答案 3 :(得分:3)
我认为执行此操作的一般方法是为每个操作创建一个触发器,如下所示:
CREATE TRIGGER INSERT_ON_TABLEA
ON TABLEA
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- INSERT ON AUX TABLEB
END
GO
CREATE TRIGGER DELETE_ON_TABLEA
ON TABLEA
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
-- DELETE ON AUX TABLEB
END
GO
答案 4 :(得分:0)
您可以通过使用union join对所有命令/操作使用一个触发器;
CREATE TRIGGER DML_ON_TABLEA
ON TABLEA
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
--logic for insert
insert into Backup_table (columns_name) select columns_name from inserted i
--logic for delete
UNION ALL
insert into Backup_table (columns_name) select columns_name from deleted d
END
GO
-注意更新命令,例如插入的命令,但是删除了另一个命令