sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLにトリガーが存在するかどうかを確認するにはどうすればよいですか?

    カタログpg_triggerを使用してください。

    テーブルの簡単な検索books

    select tgname
    from pg_trigger
    where not tgisinternal
    and tgrelid = 'books'::regclass;
    
        tgname     
    ---------------
     books_trigger
    (1 row)
    

    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()の例 関数の使用法:

    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) 
    

    Sqitchで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 $$;
    


    1. クラウドでのOracleAutonomousDatabaseの使用開始

    2. Oracle SQL Developerでデータベース名を照会する方法は?

    3. 予期しないクラスター化されたインデックスの断片化

    4. プロアクティブなPostgreSQLモニタリング(Developer Studio / Advisorsの角度)