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

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

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

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

PL/SQL

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

Q&A

3回答

6510閲覧

ORACLEトリガーが発生したテーブルの別レコードを削除する

plue

総合スコア71

Oracle

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

PL/SQL

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

0グッド

0クリップ

投稿2016/08/22 09:28

編集2022/01/12 10:55

ORACLEトリガにて、トリガの発生元レコードと
同じテーブル上の別のレコードを削除したいです。

しかし、ORACLEの制約によって、
トリガが発生したテーブルの操作はできないため実現できずに困っています。

なにかしらの方法で、上記を実現する方法はあるのでしょうか?

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

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

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

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

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

eripong

2016/08/24 04:45

回答もしていないのに指摘だけして申し訳ないのですが、タイトルのORALCEは、ORACLEとおもいます。
plue

2016/08/24 04:55

修正しました。
eripong

2016/08/24 07:35

ありがとうございます。細かいことですがスッキリしました
guest

回答3

0

しかし、ORACLEの制約によって、

トリガが発生したテーブルの操作はできないため実現できずに困っています。

質問にその時の現象を再現できるだけの情報やエラーメッセージを載せると解決が早いのですが。

テーブルにぶら下がっているトリガーはそのテーブルに対して、直接的にも間接的にもINSERT, UPDATE, DELETE はできません。

PL/SQL 第40回 「トリガー処理のルール(してはいけないこと)」

投稿2018/06/13 17:21

Orlofsky

総合スコア16415

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

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

0

恐らくトリガーの再起呼出しによる連鎖を防止するとかの目的でそのような制約があるんでしょうね・・・。

それはともかく、
すでに他の回答者さんより提案されてますが、
ストアドプロシージャとかストアドファンクションで実装するのが無難かと思います。

ある程度複雑な処理も、
ストアド化してカプセル化できるメリットもありますし。

それにトリガーを多用し過ぎると、
構成によってはトリガーの連鎖が発生し、どの時点で整合性が取れなくなったかのデバッグ・調査が困難となるので、
個人的にはあまりトリガーを多用することはお勧めできないです。

投稿2016/08/22 16:24

編集2016/08/22 16:26
Panzer_vor

総合スコア1636

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

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

plue

2016/08/23 00:41

回答ありがとうございます。 最初に回答いただいたtakyafuminさんへのコメントと同様となりますが、 ストアドプロシージャやファンクションでもトリガのように 「あるレコードの更新を契機に動作する」 ということは可能なのでしょうか?ご存知でしたらご教示いただければと思います。
Panzer_vor

2016/08/23 03:27 編集

> plueさん ストアドプロシージャやストアドファンクションは、 一連の手続きをまとめる機能となるので、 トリガーのような何かを契機に発火するという仕組みはありません。 (※トリガーからストアドを呼べたりはします) 質問者様がどういった要件を満たしたいのかがはっきらとは分かりませんが、どうしてもトリガーを使わなければ実現できないといった状況は少ないように思えます。 例えばAテーブルのいずれかのレコードの更新がある場合に、別の同一テーブルのレコードを削除したいという要件だったとしても、 更新から削除までの処理をストアド化することで実現は可能です。
guest

0

思いつきですが、ストアドプロシージャ(PL/SQL)にて元レコード削除+トリガー機能と同等の機能を実装し、レコード削除の代わりにそのストアドプロシージャを利用する方法はいかがでしょうか。

トリガーの条件等が分からないのですが、ストアドプロシージャを1トランザクションで実行することで、整合性も保てる(ロールバック、コミットもできる)かと思います。

投稿2016/08/22 11:16

takyafumin

総合スコア2335

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

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

plue

2016/08/23 00:40

回答ありがとうございます。 質問内容で明記していなかったのですが、 他システムからのテーブル更新を契機に、そのテーブルの別レコードの削除を行わなければならないため、 どうしてもトリガによる実装が必要だと思っているのですが、 ストアドプロシージャでもトリガのように 「あるレコードの更新を契機に動作する」 ということは可能なのでしょうか?調べてみましたが、それらしい情報がなく、 ご存知でしたらご教示いただければと思います。
takyafumin

2016/08/24 04:40

> 質問内容で明記していなかったのですが、 この点は質問へ追記したほうがいいですね。 後からこの質問を見る人が、ここのコメントを必ずしも読むとは限りませんので。 > ストアドプロシージャでもトリガのように > 「あるレコードの更新を契機に動作する」 > ということは可能なのでしょうか? 調べたことはないですが、トリガーとストアドプロシージャは用途が異なるので上記のようなことはできないと思います。 レコード操作を契機に動作するオブジェクトは「トリガー」であり、ストアドプロシージャはサーバにストアしておけるプロシージャであるかと。 さて、本件への対応ですが、後出しの制約(他システムからのテーブル更新を契機に、そのテーブルの別レコードの削除を行わなければならないため)満たすには、 下記のいずれかのような他システムの変更を視野に入れた方針検討が必要かと思います。 1. 他システムの実装をストアド実行するよう変えてもらう 2. 他システムの実装を更新+削除するよう変えてもらう 3. 他システムの実装をAPI呼び出しに変えてもらう 「1.」は言葉の通りです。 ストアドを作成し、そのストアドを呼び出すよう変更してもらいます。 「2.」も言葉の通りです。 「1.」に比べ、他システムの変更が大きくなる可能性があります。 「3.」は他システムが直接DBにアクセスする方式を禁止し、代わりにDB操作に関わるAPIを作成して提供します。 システム構成として、ですが他システムがDBにアクセスすることとなると今回のような弊害(変更に柔軟に対応しづらい)やセキュリティ上の課題(アカウントの貸し出し、管理)が発生するかと思います。 可能であれば途中にワンクッション(APIを作成して他システムへ公開するなど)挟む構成にできると扱いやすいかと思います。 ただし、プロジェクトの現状(既にリリース済みであったり、他システムの仕様がFIXしているなど)によって取れる対策は異なると思いますので、 現状に合わせて検討してみてください。 現状への変更を最小限にして、今後の変更にも対応できるようにするのであれば、 「1. 他システムの実装をストアド実行するよう変えてもらう」ですかね。 「3. 他システムの実装をAPI呼び出しに変えてもらう」は設計時に検討できれば採用しますが、プロジェクトが進んでしまっている状況ですと理想論であり、実現が難しいかと思います。(1機能だけそのようにしてもダメなので) --- 上記とは異なる、無責任な回答を1つ。 トリガーからストアドを呼び出すようにして、そのストアドで自テーブルの削除ができれば解決しそうですね。 未検証なのと、トリガーの制限を考慮すれば実現できなさそうですが。 ダメもと、でもよければ試してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問