質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

1020閲覧

【Oracle】DMLを取得するトリガー

poshitan

総合スコア0

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2022/11/01 13:37

編集2022/11/01 13:38

質問

前提

Oracle DatabaseとAccessを用いた基幹システムで、実行SQL文(DML)をログとして保存したい。

実現したいこと

以下のOracle公式サイトを参考にトリガーを作成しました。
https://docs.oracle.com/cd/E16338_01/appdev.112/b56260/triggers.htm

Accessでテーブルに対しINSERT, UPDATE, DELETE処理を行った際に、指定のテーブルのカラムに、実行したSQL文(DML)をINSERTしたいです。

発生している問題・エラーメッセージ

実行SQL文
(CUI SQL*PLUSにて実行)

SQL

1UPDATE M0050_USER SET USER_NAME = ‘Johnny’ WHERE USER_ID =12345;

エラーメッセージ

行1でエラーが発生しました。: ORA-06502: PL/SQL: 数値または値のエラーが発生しました ORA-06512: “ABCUSR.TRIGGER_TEST”, 行9 ORA-04088: トリガー’ABCUSR.TRIGGER_TEST’の実行中にエラーが発生しました

該当のソースコード

SQL

1CREATE TABLE event_table (col VARCHAR2(2030));

PL/SQL

1CREATE OR REPLACE TRIGGER trigger_test 2 AFTER INSERT OR UPDATE OR DELETE 3 ON M0050_USER 4 5DECLARE 6 sql_text ora_name_list_t; 7 n PLS_INTEGER; 8 v_stmt VARCHAR2(2000); 9 10BEGIN 11 n := ora_sql_txt(sql_text); 12 13 FOR i IN 1..n LOOP 14 v_stmt := v_stmt || sql_text(i); 15 END LOOP; 16 17 INSERT INTO event_table VALUES (‘text of triggering statement: ‘ || v_stmt); 18 19END;

試したこと

トリガー発動条件を、ステートメントエラーが発生した時、に変更し、敢えてステートメントエラーが発生するSQL文を実行したところ、プログラム通りの結果が返ってきました。
この事から、上記のプログラムでは、DDLは取得できるが、DMLは取得できないのでは?と考えました。

補足情報(FW/ツールのバージョンなど)

OS : Windows 7 32bit
RDBMS : Oracle Database 11.2.0.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

結果から言うと「AFTER INSERT OR UPDATE OR DELETE 」イベントの場合
ora_sql_txtに「SQL_TEXT」が入ってこないようなので以下エラーがでています。
(変数nがnullになる事が直接的なエラー原因ですね)

ORA-06502: PL/SQL: 数値または値のエラーが発生しました

つまり、ご希望のイベント発生時のSQL取得はできなにようにおもえます。
参考までにですが、以下のようなDATABASEトリガーにて、SQLエラーを発生させた
SQL文を取得する事はできます。

PL/SQL

1CREATE OR REPLACE TRIGGER trigger_test1 2--AFTER INSERT OR UPDATE OR DELETE ON M0050_USER 3AFTER SERVERERROR ON DATABASE 4DECLARE 5 sql_text ora_name_list_t; 6 n PLS_INTEGER; 7 v_stmt VARCHAR2(2000); 8BEGIN 9 n := ora_sql_txt(sql_text); 10 FOR i IN 1 .. n LOOP 11 v_stmt := v_stmt || sql_text(i); 12 END LOOP; 13 INSERT INTO event_table VALUES ('Error SQL : ' ||v_stmt); 14END; 15/

投稿2022/12/11 05:08

sooni

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2022/11/02 04:08

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問