我在INSERT,UPDATE和DELETE后在SQL Server中创建触发器。如果触发器代码在插入更新或删除语句上运行,是否有办法知道触发器代码,因为我需要对每种情况采取不同的行为,或者我需要为它们中的每一个创建触发器。SQL Server触发器
由于提前,
圣保罗
我在INSERT,UPDATE和DELETE后在SQL Server中创建触发器。如果触发器代码在插入更新或删除语句上运行,是否有办法知道触发器代码,因为我需要对每种情况采取不同的行为,或者我需要为它们中的每一个创建触发器。SQL Server触发器
由于提前,
圣保罗
有逻辑临时“插入”和“删除”表,您可以访问。
如果在这两个表中有一些行意味着它的更新。
您可以通过选择查询“插入”表来获取新值。
Select * from inserted
您可以通过查询“已删除”表来获取正在更新的旧值。
Select * from deleted
有数据集称为插入或删除。根据调用触发器的操作,这些数据集中有数据。对于更新,IIRC,原始数据处于DELETED状态,新数据处于INSERTED状态。
请参阅here。
如果更适合您,可以使用AFTER关键字为每个事件指定单独的触发器。
如: -
CREATE TRIGGER FooIns ON TableBar
AFTER INSERT
CREATE TRIGGER FooUpd ON TableBar
AFTER UPDATE
如果您需要执行“不同的行为”,又是什么,而不是每一个操作触发试图只写1触发点,?
只需使用单独的触发器!有人提到触发器是邪恶的,但如果你开始包含复杂的代码来尝试和确定行动(插入/更新/删除),它们会变得更加邪恶。如果任何人在将来触发你的触发器,他们只会质疑WTF他是在想创造不必要的复杂性!
另外值得记住的是,更新可以影响多行,因此当触发器被触发时,'删除''插入'表格可以有很多行!
正如devio所说,如果你对INSERT和DELETE做了不同的事情,你可以使用两个触发器。只需在CREATE TRIGGER行之后指定FOR INSERT或者FOR DELETE即可。
如果你想使用一个触发器,那么,如伊斯梅尔暗示的那样,你可以检查在触发器内给你的临时“插入”和“删除”表的值。
如果“deleted”表为空,则该触发器由INSERT语句触发; 如果“已删除”不为空,且“已插入”表为空,则触发器由DELETE语句触发。 如果两者都不为空,那么将使用UPDATE语句。
这对你没有帮助吗? – IsmailS 2009-11-06 12:58:12
你好,谢谢你的答案,他们都是正确的,但我想知道是否存在触发器内的自动标志,告诉我们在哪个语句正在运行。例如在PostGreSQL中,我们可以使用IF(tg_op ='INSERT')来知道触发器是否从Insert和Insert运行。非常感谢所有... – Paulo 2009-11-06 17:25:39