在我的数据库中,我需要制作条件触发器,我偶然发现了这篇文章。文章中讨论过,实现条件有两种选择:
- 选项 A:条件位于触发器函数中,而不是触发器本身
- 选项 B:条件驻留在触发器中,而不是在触发器函数中
选项 A
扳机:
CREATE TRIGGER mytrigger
BEFORE INSERT OR UPDATE ON "mytable"
FOR EACH ROW
EXECUTE PROCEDURE mytrigger();
触发功能:
CREATE OR REPLACE FUNCTION mytrigger()
RETURNS trigger AS
$BODY$
begin
if NEW.score > 5 then
--code for Insert
if (TG_OP = 'INSERT') then
YOUR CODE
end if;
--code for update
if (TG_OP = 'UPDATE') then
if OLD.score <> NEW.score then
--YOUR CODE
end if;
end if;
end if;
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
选项 B
触发器:
CREATE TRIGGER mytrigger1
BEFORE INSERT ON "mytable"
FOR EACH ROW
WHEN NEW.score > 5
EXECUTE PROCEDURE mytrigger();
CREATE TRIGGER mytrigger2
BEFORE UPDATE ON "mytable"
FOR EACH ROW
WHEN (NEW.score > 5 AND OLD.score <> NEW.score)
EXECUTE PROCEDURE mytrigger();
触发功能:
CREATE OR REPLACE FUNCTION mytrigger()
RETURNS trigger AS
$BODY$
begin
--YOUR CODE
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
!
我从引用的文章中复制了上面的代码。
我的问题:
- 性能方面,哪个更好?
- 选项 B 是否更好,因为触发器仅在条件满足时触发;而在选项A中,触发器首先会触发吗?
使用的版本:PostgreSQL 9.6 及更高版本。
准确地说:选项 B 更好,因为它避免了为不需要的行调用触发器函数的开销。