0

C#コード内からOracleデータベーストリガーにアクセスするにはどうすればよいですか?

テーブルをチェックし、それらを Oracle のそのテーブルのトリガーと比較するプログラムを作成したいと考えています。次に、テーブルのすべての列に、トリガー コードに対応する「セクション」があるかどうかを確認したいと思います。C# コードを介してトリガーへの読み取り/書き込みアクセスが必要です。

これは可能ですか?C# コードから DB トリガーにアクセスするにはどうすればよいですか?

例: TableA には Type と Value の 2 つの列があります。Trigger_TableA には次のコードしかありません。

....
IF (:OLD.TYPE IS NULL AND :NEW.TYPE IS NOT NULL) OR
   (:OLD.TYPE<> :NEW.TYPE) THEN
    vWhat_Changed := vWhat_Changed || ',TYPE='||:OLD.TYPE;
END IF;
.....

Trigger_TableA は、値ではなくタイプのみを監視しているため、不完全です。トリガーを元の状態から編集して、値列を監視するコードを含める必要があります //例の終了

4

1 に答える 1

1

User_Triggersビューを使用して、テーブルに対して起動するトリガーの名前を見つけることができます。

SELECT Trigger_Name
FROM User_Triggers
WHERE Table_Name = 'my-table-name';

トリガー コードを取得するには、次のクエリを実行しますUser_Source

SELECT Text
FROM User_Source
WHERE Name = 'my-trigger-name' AND Type = 'TRIGGER'
ORDER BY Line

補遺

各列は同じように扱われるため、次のような方がよいかもしれません (大雑把でテストされていないことに注意してください。微調整が必​​要になる可能性があります)。

DECLARE
  sqlString VARCHAR2(4000);
  CURSOR colNames IS
    SELECT Column_Name
    FROM User_Tab_Columns
    WHERE Table_Name = 'this-table-name';
BEGIN
  FOR rCols IN colNames LOOP
    sqlString :=
      'BEGIN ' ||
      '  IF (:OLD.' || rCols.Column_Name || ' IS NULL AND :NEW.' || rCols.Column_Name || ' IS NOT NULL) OR ' ||
      '     (:OLD.' || rCols.Column_Name || '<> :NEW.' || rCols.Column_Name || ') THEN' ||
      '    vWhat_Changed := vWhat_Changed || ',' || rCols.Column_Name || '=' || :OLD.' || rCols.Column_Name || ';' ||
      '  END IF; ' ||
      'END;';
  EXECUTE IMMEDIATE sqlString;
  END LOOP;
END;
于 2013-08-20T17:40:02.133 に答える