こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

トリガに排他制御をかけたいのですが

トリガに排他制御をかけたいのですが


Oracleのトリガで、
トリガ内の処理に対して排他制御をおこないたいのですが、
どのように設定すればよいのでしょうか?

トリガの内容は以下となります。

CREATE OR REPLACE TRIGGER TRI_TEST
after update of (トリガの実行条件その1) on ORG_TBL
FOR EACH ROW
begin
if (トリガの実行条件その2) THEN
begin
insert(実行される処理その1)
EXCEPTION
update(実行される処理その2)
end;
end if;
end;
/



上記の条件において、
「実行される処理その1」
「実行される処理その2」
を行っている最中に他からのアクセスをブロックをさせたく思っております。



本件の理由は
他からのアクセスで行われる処理が
「select(トリガによってデータが投入されてるテーブル)」
「truncate(トリガによってデータが投入されてるテーブル)」
を連続して行う処理のため、
排他を実行しなかった場合、
他からのアクセスの「select」と「truncate」の処理間に
トリガによってレコードがinsertされた際に、
そのレコードがselectされなくなることを危惧しているためです。

投稿日時 - 2010-11-01 14:22:30

QNo.6289797

すぐに回答ほしいです

質問者が選んだベストアンサー

排他制御ができるかどうかではなく、あなたの目的とする論理を明らかにしてください。
トリガーとかSQLではなくどんなことをしたいのかを。

Oracleの掲示板に質問した方がいいです
http://otn.oracle.co.jp/forum/index.jspa?categoryID=2

投稿日時 - 2010-11-02 10:17:15

お礼

目的は、
「トリガによって起動される実行処理の最中に、ほかからのアクセス(select&truncate)をさせたくないので、トリガから実行される処理の韓、排他制御をかけたい」
ということです。

トリガからの処理ではデータのinsertを行っているのですが、
このinsertがすべて完了するまで、他からやってくる処理(特にtruncate)を実行させ内容にしたいのです

投稿日時 - 2010-11-02 10:36:39

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

トリガー内にLOCK TABLEは書けません。
TRUNCATEも書けません。

投稿日時 - 2010-11-01 17:22:05

お礼

とすると、
排他制御はできないということでしょうか?

投稿日時 - 2010-11-02 08:53:03

ANo.1

なぜ、そのような論理なのかわかりませんが、何か別の方法があるのではないでしょうか?

>「select(トリガによってデータが投入されてるテーブル)」
>「truncate(トリガによってデータが投入されてるテーブル)」
この一連の処理の前にlock table xxx in EXCLUSIVE mode nowait すれば

投稿日時 - 2010-11-01 16:12:00

お礼

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>

と返されたのですが、
入れる場所が違っていたのでしょうか?

投稿日時 - 2010-11-01 16:48:56

あなたにオススメの質問