6
一部の表にトリガーを追加するデータベース移行の正確性を検証したいと考えています。私はsqitchを使用しているので、SQLクエリで確認する方法を探したいと思います。 Postgresのシステムテーブルでは可能なはずだと思いますが、私は現在これを行う方法を見つけることができません。PostgreSQLにトリガが存在するかどうかを確認するには?
一部の表にトリガーを追加するデータベース移行の正確性を検証したいと考えています。私はsqitchを使用しているので、SQLクエリで確認する方法を探したいと思います。 Postgresのシステムテーブルでは可能なはずだと思いますが、私は現在これを行う方法を見つけることができません。PostgreSQLにトリガが存在するかどうかを確認するには?
カタログpg_triggerを使用してください。トリガ機能のソースを取得するためにpg_proc
を使用し
select tgname
from pg_trigger
where not tgisinternal
and tgrelid = 'books'::regclass;
tgname
---------------
books_trigger
(1 row)
:pg_get_triggerdef()
機能の使用状況の
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)
例:
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)
を
テーブル
books
のためのシンプルな検索私は実際にこれを試み、かなり混乱していました。私はpostgresql 9.4を使用しています。私は7つの 'tgname'が1の代わりに' RI_ConstraintTrigger_c_195564'のようになっています。 – dredozubovこれらは内部制約トリガーです。編集された答えのように 'not tgisinternal'を使ってスキップしてください。 – klin
ありがとう!それは助けになった! – dredozubov