我正在寻找一个符合ANSI标准的SQL触发器,并且相信我有90%的方式,但我错过了几件。我对它的性能也有一些问题/担忧(作为SQL语句和触发器)。
我有一张名为 widgets
的表格:
widgets
widget_id | widget_name | widget_type_id | widget_is_fizz
========================================================================
1 Apple 1 0
2 Kiwi 2 0
3 Pear 3 1
... ... ... ...
2634 Banana 28 0
我需要触发器在此表上发生INSERT或UPDATE时触发:
widget_type_id
为17且widget_is_fizz
为1(真)的INSERT;或当在此表上插入或更新类型ID为17的“fizz小部件”时,我想将其widget_name
更改为“UNKNOWN”。
到目前为止,我最好的尝试:
CREATE TRIGGER widget_name_trigger
ON
widgets
FOR
INSERT
AS
UPDATE
widgets
SET
widget_name = 'UNKNOWN'
WHERE
widget_type_id = 17
AND
widget_is_fizz = 1
仍然无法弄清楚如何让它为UPDATE做同样的事情,就像它对INSERT一样。还不确定它是否在语法上是正确的并且符合ANSI标准。
另外,就性能而言,谣言说我们的DBA讨厌触发器,并且当我在他面前进行代码审查时可能会打架。触发器本身就很昂贵吗?如果是这样,为什么,我能在这里做些什么来减轻这种缓慢?提前谢谢。
答案 0 :(得分:0)
您可以对插入和更新使用相同的触发器。无需更新整个表,只需更新插入/更新的行。
CREATE TRIGGER widget_name_trigger
ON
widgets
FOR
INSERT, UPDATE
AS
UPDATE
widgets
SET
widget_name = 'UNKNOWN'
WHERE
widget_type_id = 17
AND
widget_is_fizz = 1
AND
widget_id=inserted.widget_id
在性能方面:只要你没有引用其他表,开销就会很低 从Sybase手册:
就性能而言,触发开销通常非常低。运行触发器所涉及的时间主要用于引用其他表,这些表可能在内存中或数据库设备上 已删除和插入的触发器测试表始终位于活动内存中。触发器引用的其他表的位置决定了操作所花费的时间。