14

テーブルにデータを挿入する前に、テーブルの特定のトリガーを無効にしたいのですが、同じテーブルのデータを変更している可能性のある他のユーザーには影響を与えません。これを行うための文書化された方法が見つかりません。これはOracle11gです。

私が思いついた最善の解決策は、セッション変数を作成し、それをトリガーが作業を行う前にチェックする値に設定することです。

必須の反トリガーコメント:私はトリガーが嫌いです。

4

4 に答える 4

4

既存のパッケージ仕様に変数を追加します(または新しいパッケージを作成します)。

enable_trigger boolean:= true;

トリガーのコードを次のように囲みます。

enable_triggerの場合

次の場合に終了します。

トリガーを「無効」にする場合は、変数をfalseに設定します。

ベストプラクティスは、変数を本体に配置し、setプロシージャとget関数を作成することです。

于 2013-03-27T13:47:59.930 に答える
3

oracleまたは他のrdbmsで特定のセッションに対してトリガーを無効にすることが可能であるとは思いません。

私の解決策は、ログイン元のCURRENT_USERまたはsession_idがわかっている場合は、トリガーに条件を設定できるということです。

  IF SYS_CONTEXT ('USERENV', 'CURRENT_USER') <> '<XYZ>' THEN
    --do the operation

  END IF; 

トリガーを入れる必要があるこの条件

于 2013-03-27T12:59:10.727 に答える
3

dbms_application_info.set_client_info (Oracleドキュメントへのリンク)を使用して、プロシージャでset_client_infoを実行し、トリガーで読み取ります。

簡単な例:

SET SERVEROUTPUT ON   
declare
CI_Status VARCHAR2(25 BYTE):='';
begin
--set the value
dbms_application_info.set_client_info('qwerty');
-- the value is sent an out to CI_Status when you want to read it
DBMS_APPLICATION_INFO.READ_CLIENT_INFO (CI_Status);
--Output the value in the console 
dbms_output.put_line('Value of CI_Status is: ' || CI_Status); 
end;

あなたの手順では:

procedure spname is
    begin
      dbms_application_info.set_client_info('qwerty');
      --Do your update
      UPDATE tableName set a=b;
      --in case you still have the sesion opened, set it to null after
      dbms_application_info.set_client_info(null);
end;

トリガーする場合:

create or replace TRIGGER Triggername
 BEFORE INSERT OR UPDATE
 ON tablename
 FOR EACH ROW
declare
CI_Status VARCHAR2(25 BYTE):='';
begin
--Retrieve the value into CI_Status the variable
DBMS_APPLICATION_INFO.READ_CLIENT_INFO(CI_Status); 
    IF INSERTING THEN
       null;
    ELSIF UPDATING THEN
          IF CI_Status = 'qwerty' then
             --Do nothing since you dont want the trigger to fire
              null;
          ELSIF CI_Status is null then
            :new.tablefield:= SYSDATE;
          END IF;
    END IF;
end Triggername;

同時発生を気にせずに完全に無効にする

 procedure spname is
    begin    
      EXECUTE IMMEDIATE 'ALTER TRIGGER Triggername DISABLE';
      UPDATE tableName set a=b;
      EXECUTE IMMEDIATE 'ALTER TRIGGER Triggername ENABLE';
   end;
于 2018-11-20T17:05:06.080 に答える
2

たぶん、Oracle Editionsはこの目的に役立ちますか?別のエディションで別のトリガーを作成し、そのエディションを使用するようにセッションを変更します。

http://www.oracle-base.com/articles/11g/edition-based-redefinition-11gr2.php#editions

私はエディションの実際的な経験がないことを告白しなければなりません。

于 2013-03-27T13:30:24.360 に答える