2009-11-06 215 views
1

我在INSERT,UPDATE和DELETE后在SQL Server中创建触发器。如果触发器代码在插入更新或删除语句上运行,是否有办法知道触发器代码,因为我需要对每种情况采取不同的行为,或者我需要为它们中的每一个创建触发器。SQL Server触发器

由于提前,

圣保罗

+0

这对你没有帮助吗? – IsmailS 2009-11-06 12:58:12

+1

你好,谢谢你的答案,他们都是正确的,但我想知道是否存在触发器内的自动标志,告诉我们在哪个语句正在运行。例如在PostGreSQL中,我们可以使用IF(tg_op ='INSERT')来知道触发器是否从Insert和Insert运行。非常感谢所有... – Paulo 2009-11-06 17:25:39

回答

1

有逻辑临时“插入”和“删除”表,您可以访问。

如果在这两个表中有一些行意味着它的更新。

您可以通过选择查询“插入”表来获取新值。

Select * from inserted 

您可以通过查询“已删除”表来获取正在更新的旧值。

Select * from deleted 
3

有数据集称为插入或删除。根据调用触发器的操作,这些数据集中有数据。对于更新,IIRC,原始数据处于DELETED状态,新数据处于INSERTED状态。

请参阅here

1

如果更适合您,可以使用AFTER关键字为每个事件指定单独的触发器。

如: -

CREATE TRIGGER FooIns ON TableBar 
AFTER INSERT 

CREATE TRIGGER FooUpd ON TableBar 
AFTER UPDATE 
+0

触发器是邪恶的,如果我们只能使用一个,我们只能使用一个触发器。 – silent 2009-11-06 13:30:12

+0

触发器是邪恶的,伊莫不要使用它们。但是如果你打算使用它们,保持它们分离和组织起来有助于维护 – badbod99 2009-11-06 13:36:13

+0

如果能胜任的开发人员正确使用触发器并不是坏事。 – HLGEM 2009-11-06 16:38:53

3

如果您需要执行“不同的行为”,又是什么,而不是每一个操作触发试图只写1触发点,?

0

只需使用单独的触发器!有人提到触发器是邪恶的,但如果你开始包含复杂的代码来尝试和确定行动(插入/更新/删除),它们会变得更加邪恶。如果任何人在将来触发你的触发器,他们只会质疑WTF他是在想创造不必要的复杂性!

另外值得记住的是,更新可以影响多行,因此当触发器被触发时,'删除''插入'表格可以有很多行!

0

正如devio所说,如果你对INSERT和DELETE做了不同的事情,你可以使用两个触发器。只需在CREATE TRIGGER行之后指定FOR INSERT或者FOR DELETE即可。

如果你想使用一个触发器,那么,如伊斯梅尔暗示的那样,你可以检查在触发器内给你的临时“插入”和“删除”表的值。

如果“deleted”表为空,则该触发器由INSERT语句触发; 如果“已删除”不为空,且“已插入”表为空,则触发器由DELETE语句触发。 如果两者都不为空,那么将使用UPDATE语句。