- ベストアンサー
Statement ignored というエラー
Oracle 9iを使ってsqlファイルを実行させたところ、タイトルにあるように、 PL/SQL: SQL Statement ignored というエラーメッセージが出力されました。 いろいろ検索してみると、これは、私にシステム権限がないことからおこるとあったのですが、 その設定変更の仕方がいまいちよくわかりませんでした。設定変更のしかたを教えていただけないでしょうか。 また、設定変更したことによって変わるのは私自身のシステム権限だけであって、他にコンピュータ(UNIX)を共有している人たちには影響はありませんよね? 立て続けに質問ばかりすみませんが、よろしくおねがいします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
PL/SQLで権限がないということは、EXECUTE PROCEDUREシステム権限がないということでしょうか・・・。 前後のエラーも記載していただいた方が良いとは思いますが。 システム権限の付与方法は下記で行うことが可能です。 ※ここでいう"ユーザ"はOracleユーザのことでスキーマとイコールです。 1.SYSTEMまたはSYS(DBA権限を持ったユーザ)でログイン 2.grant execute procedure to [対象ユーザ]; または grant resource to [対象ユーザ]; 以上で一応権限付与はできますが、どのような処理を行いたいかによって、これだけで解決するかどうかわかりません。 また、他の人への影響ですが、ユーザをどのように使用しているか、どのようなポリシーのシステムかによって異なります。(「私自身」というのが、セッションのことかスキーマのことかわかりませんでした。) 同じユーザを他の人と共通で使っていれば、もちろん他の人へ影響が出ますし、一人1ユーザ(スキーマ)で割当てられていれば、影響なく使えます。 「影響が出る」という意味は、セキュリティレベルが権限付与された分落ちるということで、機能的に使用できなくなることはありません。 なお、セッション単位で権限を割当てる方法はないと思っています。 付与した権限をセッション終了次第revokeすれば、元に戻るのではないでしょうか。
その他の回答 (4)
- guchi32
- ベストアンサー率100% (10/10)
最初にお聞きしましたので、稼動実績のあるSQLと思っていましたが・・・。 「正常に動いたことは一度もない」ということですね? Oracleでは稀に、許容できないはずの構造を作成順序によってはうまく作れてしまい、その結果誤ったエラー番号を表示してしまうことがあります。 記載していただいたORA-04044は「本文(BEGIN以下)2行目の14バイト目にプロシージャなどのオブジェクトを記載することはできない」という意味です。 一度、ViewingPendingにテストデータ(4列分)を入力してみてできるかどうか試していただけませんでしょうか? (記載していただいたCreate文が正確であれば、できないと思いますよ。) 例) insert into viewingpending values(1,1,sysdate,'TEST');
- guchi32
- ベストアンサー率100% (10/10)
一つのスキーマ内で同様(テスト用)のSQLを実行したところ、こちらでは問題なく動きました。 最初に戻りますが、なぜ「システム権限がないことに起因する」という結論に至ったのでしょうか。(ORA-04044からではその結論は出ないと思いますが・・・) また、下記のViewingPendingテーブルのCreate文がすべてであるとすると、そもそもviewDateやviewCommentを格納するカラムがありませんね。 長くなるようでしたら、関連するカラムだけでも結構ですので、ViewingテーブルとViewingPendingテーブルのCreate文を再度記載していただくことは可能ですか?
補足
一度補足を投稿したつもりだったのですが、されていなかったみたいです。遅くなってすみません。 システム権限の有無が原因だと言う結論に至った理由は・・・実はよくわからないのです。あちこち調べまくって自分で出してしまった結果だったので、間違っていたのでしょうね・・・。 以下がViewingとViewingPendingテーブルです。 create table Viewing( clientNo number(3), propertyNo varchar2(4), viewDate date, viewComment varchar2(20), primary key(clientNo, propertyNo), foreign key(clientNo) references Client, foreign key(PropertyNo) references PropertyForRent ); create table ViewingPending( clientNo number(3) not null, propertyNo varchar2(4) not null, primary key (clientNo, propertyNo), foreign key (clientNo) references Viewing, foreign key (propertyNo) references Viewing );
- guchi32
- ベストアンサー率100% (10/10)
ViewingPendingオブジェクトはテーブルでしょうか? 下記を実行してみてください。 select object_type from user_objects where object_name = 'VIEWINGPENDING'; オブジェクトタイプがTABLEやVIEWなど値格納可能なオブジェクトでなければ同様のエラーが出ます。 ちなみに下記ソースの下から2行目の最後の部分は途切れただけですよね?
補足
あ。そうです。ソースが途切れていました。 正しくは、 BEGIN insert into ViewingPending value(:old.clientNo, :old.propertyNo,:old.viewDate, :old.viewComment); END; でした。 ちなみに、ViewingPendingを実行してみたところ no rows selected と表示されました。 ちなみに、ViewingPendingは、テーブルで、下記のように指定してあります。 create table ViewingPending( clientNo varchar2(5) not null, propertyNo varchar2(4) not null, primary key (clientNo, propertyNo), foreign key (clientNo) references Viewing, foreign key (propertyNo) references Viewing );
- guchi32
- ベストアンサー率100% (10/10)
ORA-4044は基本的に構文エラーになります。 既に動かしている実績のあるSQLファイルでしょうか? もう少し詳細に記載していただいた方が、糸口を見つけやすいと思います。 システム権限としては、RESOURCEロールを与えておけばTRIGGERを含むPL/SQLの作成・実行は可能になります。 権限の問題でどうしても引っかかるようであれば、一旦DBAロールを与えてみて、「権限の問題かどうか」という切り分けを行ってみてはいかがでしょうか。(本番環境では難しいかもしれませんが。)
補足
はい。すでに何度か動かしています。が、エラーがでているので、きちんとした結果が出ないでいます。 詳細に・・・ということでしたので、trigger関係の部分を下に示させていただきます。 <Define2Triggers.sql> /**** NewPendingTrigger ****/ create or replace trigger NewPendingTrigger after insert on Viewing for each row BEGIN insert into ViewingPending values(:new.clientNo, :new.propertyNo); END; /**** RemovePendingTrigger ****/ create or replace trigger RemovePendingTrigger after update of ViewComment on Viewing for each row BEGIN insert into ViewingPending values(:old.clientNo, :old.propertyNo, :old.$ END; NewPendingTriggerは、Viewingテーブルに入力があったときに、その入力をNewPendingTriggerにも入れる。 RemovePendingTriggerは、ViewingテーブルのviewCommentフィールドがアップデートされたときに、消されたデータをRemovePendingTriggerに入力するという処理を行います。
補足
念のためというか、前後のエラーも同時に表示しておきます。 2/2 PL/SQL: SQL Statement ignored 2/14 PL/SQL: ORA-04044: procedure, function, package, or type is not allowed here これの場合だと、システム権限の問題とかではなかったりするのでしょうか。 ちなみに、エラーが出ているのが、triggerの部分です。