我想验证将触发器添加到某些表的数据库迁移的正确性。我正在使用sqitch,因此我想找到一种使用SQL查询进行检查的方法。我相信postgres系统表应该有可能,但是我目前找不到实现此目的的方法。
使用目录pg_trigger。
一个简单的表查询books:
books
select tgname from pg_trigger where not tgisinternal and tgrelid = 'books'::regclass; tgname --------------- books_trigger (1 row)
使用pg_proc得到触发功能的来源:
pg_proc
select tgname, proname, prosrc from pg_trigger join pg_proc p on p.oid = tgfoid where not tgisinternal and tgrelid = 'books'::regclass; tgname | proname | prosrc ---------------+---------------+------------------------------------------------ books_trigger | books_trigger | + | | begin + | | if tg_op = 'UPDATE' then + | | if new.listorder > old.listorder then + | | update books + | | set listorder = listorder- 1 + | | where listorder <= new.listorder + | | and listorder > old.listorder + | | and id <> new.id; + | | else + | | update books + | | set listorder = listorder+ 1 + | | where listorder >= new.listorder + | | and listorder < old.listorder + | | and id <> new.id; + | | end if; + | | else + | | update books + | | set listorder = listorder+ 1 + | | where listorder >= new.listorder + | | and id <> new.id; + | | end if; + | | return new; + | | end (1 row)
pg_get_triggerdef()函数用法示例:
pg_get_triggerdef()
select pg_get_triggerdef(t.oid) as "trigger declaration" from pg_trigger t where not tgisinternal and tgrelid = 'books'::regclass; trigger declaration -------------------------------------------------------------------------------------------------------------- CREATE TRIGGER books_trigger BEFORE INSERT OR UPDATE ON books FOR EACH ROW EXECUTE PROCEDURE books_trigger() (1 row)
在Sqitchverify脚本中,您可以使用匿名代码块,例如:
verify
do $$ begin perform tgname from pg_trigger where not tgisinternal and tgrelid = 'books'::regclass; if not found then raise exception 'trigger not found'; end if; end $$;