- ベストアンサー
Oracleトリガでの排他制御についての質問
- Oracleのトリガで、トリガ内の処理に対して排他制御をおこないたいのですが、どのように設定すればよいのでしょうか?実行される処理その1と実行される処理その2を行っている最中に他からのアクセスをブロックをさせたい理由として、他からのアクセスで行われる処理が「select(トリガによってデータが投入されてるテーブル)」と「truncate(トリガによってデータが投入されてるテーブル)」を連続して行う処理のため、排他を実行しなかった場合、他からのアクセスの「select」と「truncate」の処理間にトリガによってレコードがinsertされた際に、そのレコードがselectされなくなることを危惧している。
- Oracleのトリガで、トリガ内の処理にどのようにして排他制御を設定するかについての質問です。具体的には、実行される処理その1と実行される処理その2を行っている最中に他からのアクセスをブロックさせたい理由として、他からのアクセスで行われる処理が「select(トリガによってデータが投入されてるテーブル)」と「truncate(トリガによってデータが投入されてるテーブル)」を連続して行う処理のため、排他を実行しなかった場合、他からのアクセスの「select」と「truncate」の処理間にトリガによってレコードがinsertされた際に、そのレコードがselectされなくなることを危惧しています。
- Oracleのトリガで、トリガ内の処理に対して排他制御を設定する方法について教えてください。実行される処理その1と実行される処理その2を行っている最中に他からのアクセスをブロックさせたい理由として、他からのアクセスで行われる処理が「select(トリガによってデータが投入されてるテーブル)」と「truncate(トリガによってデータが投入されてるテーブル)」を連続して行う処理のため、排他を実行しなかった場合、他からのアクセスの「select」と「truncate」の処理間にトリガによってレコードがinsertされた際に、そのレコードがselectされなくなることを危惧しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
排他制御ができるかどうかではなく、あなたの目的とする論理を明らかにしてください。 トリガーとかSQLではなくどんなことをしたいのかを。 Oracleの掲示板に質問した方がいいです http://otn.oracle.co.jp/forum/index.jspa?categoryID=2
その他の回答 (2)
- SaKaKashi
- ベストアンサー率24% (755/3136)
トリガー内にLOCK TABLEは書けません。 TRUNCATEも書けません。
お礼
とすると、 排他制御はできないということでしょうか?
- SaKaKashi
- ベストアンサー率24% (755/3136)
なぜ、そのような論理なのかわかりませんが、何か別の方法があるのではないでしょうか? >「select(トリガによってデータが投入されてるテーブル)」 >「truncate(トリガによってデータが投入されてるテーブル)」 この一連の処理の前にlock table xxx in EXCLUSIVE mode nowait すれば
お礼
lock table TRI_TEST in EXCLUSIVE mode nowait はトリガ内にも置くことはできますか? CREATE OR REPLACE TRIGGER TRI_TEST after update of (トリガの実行条件その1) on ORG_TBL FOR EACH ROW begin lock table TR_REF_DENSOURO in EXCLUSIVE mode nowait if (トリガの実行条件その2) THEN begin insert(実行される処理その1) EXCEPTION update(実行される処理その2) end; end if; end; / を実行したところ LINE/COL ERROR -------- ----------------------------------------------------------------- 4/18 PL/SQL: SQL Statement ignored 5/10 PL/SQL: ORA-00933: SQLコマンドが正しく終了されていません。 SQL> と返されたのですが、 入れる場所が違っていたのでしょうか?
お礼
目的は、 「トリガによって起動される実行処理の最中に、ほかからのアクセス(select&truncate)をさせたくないので、トリガから実行される処理の韓、排他制御をかけたい」 ということです。 トリガからの処理ではデータのinsertを行っているのですが、 このinsertがすべて完了するまで、他からやってくる処理(特にtruncate)を実行させ内容にしたいのです