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

Oracleのトリガー内でトリガーを無効にできますか?

    これが私が質問を理解した方法です。それが役立つかどうかを確認してください。

    サンプルテーブル:

    SQL> create table test (id number);
    
    Table created.
    
    SQL> create table test_2 (id number);
    
    Table created.
    

    test_2のトリガー 挿入を防ぎます:

    SQL> create or replace trigger trg2
      2    before insert or update on test_2
      3    for each row
      4  begin
      5    raise_application_error(-20000, 'Not allowed');
      6  end;
      7  /
    
    Trigger created.
    

    動作しますか?

    SQL> insert into test_2 (id) values (1);
    insert into test_2 (id) values (1)
                *
    ERROR at line 1:
    ORA-20000: Not allowed
    ORA-06512: at "SCOTT.TRG2", line 2
    ORA-04088: error during execution of trigger 'SCOTT.TRG2'
    

    はい、機能します。

    ここで、testのトリガー これは、a)trg2を無効にすることになっています トリガーおよびb)値をtest_2に挿入します 。簡単なコードは次のようになります

    SQL> create or replace trigger trg1
      2    before insert on test
      3    for each row
      4  begin
      5    execute immediate 'alter trigger trg2 disable';
      6    insert into test_2 (id) values (:new.id);
      7  end;
      8  /
    
    Trigger created.
    

    テストしてみましょう:

    SQL> insert into test (id) values (1);
    insert into test (id) values (1)
                *
    ERROR at line 1:
    ORA-04092: cannot COMMIT in a trigger
    ORA-06512: at "SCOTT.TRG1", line 2
    ORA-04088: error during execution of trigger 'SCOTT.TRG1'
    

    あは。 COMMITできません トリガーで。それはどこにある?動的SQLのalter trigger -これはDDLであり、暗黙的にコミットします。それを「修正」する方法は?それを(トリガー)自律的なトランザクションにします:

    SQL> create or replace trigger trg1
      2    before insert on test
      3    for each row
      4  declare
      5    pragma autonomous_transaction;
      6  begin
      7    execute immediate 'alter trigger trg2 disable';
      8    insert into test_2 (id) values (:new.id);
      9  end;
     10  /
    
    Trigger created.
    
    SQL> insert into test (id) values (1);
    insert into test (id) values (1)
                *
    ERROR at line 1:
    ORA-06519: active autonomous transaction detected and rolled back
    ORA-06512: at "SCOTT.TRG1", line 6
    ORA-04088: error during execution of trigger 'SCOTT.TRG1'
    

    これは別のエラーです。自律的なトランザクションがある場合は、コミットするかロールバックする必要があると書かれています。コミットしましょう(おそらくそれがあなたがやりたいことだからです):

    SQL> create or replace trigger trg1
      2    before insert on test
      3    for each row
      4  declare
      5    pragma autonomous_transaction;
      6  begin
      7    execute immediate 'alter trigger trg2 disable';
      8    insert into test_2 (id) values (:new.id);
      9    commit;
     10  end;
     11  /
    
    Trigger created.
    
    SQL> insert into test (id) values (100);
    
    1 row created.
    
    SQL> select * From test;
    
            ID
    ----------
           100
    
    SQL> select * from test_2;
    
            ID
    ----------
           100
    
    SQL>
    

    右;今では動作します

    質問の下に投稿されたコメントを読み直して、この例を参照し、何をするかを選択することをお勧めします。




    1. AWSElasticBeanstalkでのmysqlclientインストールエラー

    2. json内のJDBCプリペアドステートメントパラメータ

    3. 選択/ドロップダウンメニューPHPまたはHTMLの選択値を変数に取り込む方法

    4. Oracleは更新動作を選択します