dポイントプレゼントキャンペーン実施中!

WindowsXPのOracle9i環境です。
以下のようなトリガーを作成しました。

create or replace trigger kan_trg
after update or insert on t_kan
declare
begin
execute immediate 'create or replace view V_test as select
・・
from t_kan with read only';
end;
/

その後、試しに「insert into t_kan ・・・」 と実行してみましたが、「ORA-04092:トリガーはCOMMITできません」が発生します。
色々調べましたがトリガーの中にCOMMIT文を入れることはできないようです。どのようにすれば解決するか、ご教示いただけませんでしょうか?
宜しくお願い致します。

A 回答 (3件)

うーん、あまり考えられませんね。


9iの環境で簡略して環境でやってみましたが、正常にSELECTできましたよ。
    • good
    • 0
この回答へのお礼

ご連絡遅くなりました。私の勘違いで上手くいけてました。
ありがとうございました。

お礼日時:2008/12/29 16:37

insert into したセッションとは別のセッションで検索しようとしていませんか。


AFTERトリガでもCOMMITしていないデータは別セッションからは検索できませんよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
同一セッションで検索してますし、commitもしております。
他に何か考えられることありますでしょうか?

お礼日時:2008/12/25 20:25

「create any view」権限を持ったユーザーで


create or replace procedure kan_proc(str in varchar2)
is
PRAGMA AUTONOMOUS_TRANSACTION;
-- ↑ 自律型トランザクション プラグマ
begin
execute immediate str;
end;
/

create or replace trigger kan_trg
after update or insert on t_kan
begin
kan_proc('create or replace view V_test as select * from t_kan with read only');
end;
/
「create any view」権限はロール経由では無効になるので、DBA権限を
持ったユーザーでプロシージャを作っても実行時「権限不足」になるので
注意。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
「自律型トランザクション プラグマ」というのが調べても高度でよく理解できませんでしたが、とりあえずビューは作成できたようです。
ところが、t_kanテーブルにinsert文にてテストしてみましたが、トリガーにて「after」指定にもかかわらず、作成されたビューの中にはinsertしたレコードが入ってきませんでした。
それでは意味がないのですが、なぜなのでしょうか??

お礼日時:2008/12/25 00:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!