2015-10-16 21 views
6

一部の表にトリガーを追加するデータベース移行の正確性を検証したいと考えています。私はsqitchを使用しているので、SQLクエリで確認する方法を探したいと思います。 Postgresのシステムテーブルでは可能なはずだと思いますが、私は現在これを行う方法を見つけることができません。PostgreSQLにトリガが存在するかどうかを確認するには?

答えて

11

カタログ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) 
+0

テーブルbooksのためのシンプルな検索私は実際にこれを試み、かなり混乱していました。私はpostgresql 9.4を使用しています。私は7つの 'tgname'が1の代わりに' RI_ConstraintTrigger_c_195564'のようになっています。 – dredozubov

+1

これらは内部制約トリガーです。編集された答えのように 'not tgisinternal'を使ってスキップしてください。 – klin

+0

ありがとう!それは助けになった! – dredozubov

関連する問題