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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

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回答

10215閲覧

【Oracle】DELETE時のトリガー起動で削除されたレコードの情報は取得できるのか?

kukku-zelda

総合スコア22

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

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クリップ

投稿2018/02/20 04:27

Oracleでのトリガー処理について質問させてください。

DELETE文が発行されたときのトリガー起動タイミングについて悩んでます。

【知りたいこと】
DELETE時のトリガー起動でAFTER指定の場合、削除されたレコードの情報は取得できるのか?

やりたいことは以下の通りです。
・トリガーは対象テーブルにレコードが追加・更新・削除されたときに動作する。
・追加・更新・削除されたレコードの情報(キー等)を別テーブルに書き込む。
・追加・更新・削除時の処理を一つの定義で管理したい。

このとき、DELETE文が発行された場合、トリガーはBEFORE指定で動かすべきなのか、
AFTER指定で動かせるのかで悩んでいます。
追加・更新・削除されたレコードの情報をどちらの指定でも取ることが可能であれば、
定義を一つにまとめられると思っています。
もし情報がうまくとれないのであれば、操作毎にトリガー定義が必要なのかと思います。

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

DELETE時のトリガー起動でAFTER指定の場合、削除されたレコードの情報は取得できるのか?
に対しては、できますよ。:OLDというバインド変数を使えば取れます。
以下サンプルもご参考ください。

SQL

1-- 対象テーブル作成 2CREATE TABLE TEST( 3KEY VARCHAR2(5), 4VALUE VARCHAR2(20) 5); 6 7-- ログテーブル作成 8CREATE TABLE HIST( 9QUERY VARCHAR2(6), 10KEY VARCHAR2(5), 11TIME DATE 12); 13 14-- トリガー作成 15CREATE OR REPLACE TRIGGER TRG 16 AFTER INSERT OR UPDATE OR DELETE ON TEST 17 FOR EACH ROW 18 BEGIN 19 IF INSERTING THEN 20 INSERT INTO HIST VALUES('INSERT',:NEW.KEY,SYSDATE); 21 ELSIF UPDATING THEN 22 INSERT INTO HIST VALUES('UPDATE',:OLD.KEY,SYSDATE); 23 ELSIF DELETING THEN 24 INSERT INTO HIST VALUES('DELETE',:OLD.KEY,SYSDATE); 25 END IF; 26 END; 27/ 28 29-- テーブル更新 30INSERT INTO TEST VALUES('K0001','A'); 31INSERT INTO TEST VALUES('K0002','B'); 32INSERT INTO TEST VALUES('K0003','C'); 33UPDATE TEST SET VALUE = 'Z' WHERE KEY = 'K0002'; 34DELETE FROM TEST WHERE KEY = 'K0003'; 35 36-- ログテーブル確認 37SELECT * FROM HIST; 38

QUERY KEY TIME


INSERT K0001 18-02-20
INSERT K0002 18-02-20
INSERT K0003 18-02-20
UPDATE K0002 18-02-20
DELETE K0003 18-02-20

投稿2018/02/20 05:55

編集2018/02/20 06:28
ka_ei

総合スコア207

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

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

0

DELETE時トリガーにログテーブルに書き込む機能を追加されては?
トリガーで更新ログ採取

投稿2018/02/20 04:51

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問