• ベストアンサー
  • すぐに回答を!

Flashback Tableで必要な権限

OcaleMasterにむけて勉強中です。 Oracle11.2をOracleLinux5にインストールして以下を行いました。 1.ユーザー「test」を作成。権限はconnectロールのみ。 2.sqlplusにtestでログイン(sqlplus test/***) 3.テーブル「t1」を作成/行移動を有効。 4.t1に対し挿入・更新を実行する。 5.flashback tableを実施すると以下のようなエラーが発生しました。 SQL> flashback table test.t1 to scn 1015246; flashback table test.t1 to scn 1015246 * 行1でエラーが発生しました。: ORA-00604: 再帰SQLレベル1でエラーが発生しました。 ORA-01031: 権限が不足しています。 6.testにflashback any tableシステム権限/sysdba権限を付与 7.sqlplusにtestで再度ログイン(sqlplus test/***) 8.flashback tableを実施するとやはり同様のエラーが発生しました。 9.sqlplusにsysdbaでtestで再度ログイン。(sqlplus test/*** as sysdba) 10.flashback tableを実施すると成功しました。 参考書などの記載を見る限り、基本的に自分のテーブルであれば権限は不要と思ったのですが(少なくともSYSDBAでないと不可というものではないはず!?)、No5、No8でエラーとなってしまったのは、どこに問題があったものでしょうか。 何か情報ありましたら教えてください。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数901
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.1

こんにちわ。 >どこに問題があったものでしょうか。 Oracle のマニュアル (SQL リファレンス) には、以下のように記載されています。 > 表を以前のSCNまたはタイムスタンプまでフラッシュバックするには、 > その表に対するFLASHBACKオブジェクト権限か、FLASHBACK ANY TABLE > システム権限が必要です。 また、その表に対するSELECT、INSERT、DELETE > およびALTERオブジェクト権限が必要です。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 私の方でもマニュアルの方は確認しまして、たとえば別ユーザー(FLASHBACKオブジェクト権限以外をtest.t1に付与。FLASHBACKのみない。)で以下を実行したところでは、直接エラーが発生しました。 SQL> flashback table test.t1 to scn 1015246; flashback table test.t1 to scn 1015246 * 行1でエラーが発生しました。: ORA-01031: 権限が不足しています。 対してtestでは再帰SQLにてエラーとなっています。 testユーザーはt1に対しては自所有のオブジェクトのため全オブジェクト権限を持っているはずですし、No8ではFLASHBACK ANY TABLEを付与しても発生したので、マニュアルに記載以外の条件が必要なのではと思った次第でした。 なお、その別ユーザーにFLASHBACK ANY TABLEを付与しても同様でした。 的外れかもしれませんが、ディクショナリ関連の権限が必要かと推測しています・・・。 他になにか情報ありましたら教えてください。

関連するQ&A

  • 参照権限の付与方法

    環境は、Windows Server 2003、Oracle 9.2.0.6.0 になります。 userAが持っている表、ビューの参照権限を userBに与えようと思います。 userAでログインし、以下のSQLを発行したところ、  grant select any table to userB; 以下のエラーが出ました。  ORA-01031:権限が不足しています。 これは、userAに権限を付与する権限がないのだと 理解しました。 ■疑問1 この現象は、userAに権限を付与する権限がない との理解で正しいでしょうか? また、userAに「権限を付与する権限」を付与するには どのようなSQLを発行すればよいでしょうか? ■疑問2 systemユーザでログインし、userBに権限を与える方法も あると思います。 その場合、以下のSQL文になると思います。  grant select on userA.testtable to userB この場合、表、ビュー1つずつ与える必要がありますが、  grant select any table to userB; のように、全ての表、ビューを参照権限を与えることはできるでしょうか?

  • Oracle テーブルの列削除

    タイトルの通りテーブル(test)の列(retu)を削除したいのですが・・・ Sql*pLUS画面 SQL> alter table test drop(retu); ←この用に入力 alter table test drop(retu) * エラー行: 1: エラーが発生しました。 ORA-00905: キーワードがありません。 となってしまい列を削除できません。 なにか構文の間違いでしょうか?

  • ORA-14459: GLOBALキーワードがありません。

    ORA-14459: GLOBALキーワードがありません。 以下のSQLを実行したところエラーになりました。 GLOBALキーワードとは何でしょうか?原因を教えてください。 SQL> CREATE TEMPORARY TABLE TEST AS SELECT SYSDATE FROM DUAL; CREATE TEMPORARY TABLE TEST AS SELECT SYSDATE FROM DUAL * 行1でエラーが発生しました。: ORA-14459: GLOBALキーワードがありません。 ORACLE 10g Windows 2008

その他の回答 (1)

  • 回答No.2

こんにちわ。 #1 のmuyodhid です。 > 1.ユーザー「test」を作成。権限はconnectロールのみ。 > 2.sqlplusにtestでログイン(sqlplus test/***) > 3.テーブル「t1」を作成/行移動を有効。 Oracle 10.2 から、connect ロールにはCreate session System 権限しか 無くなった筈ので、Create table もできないはずです。 権限を付与したユーザとFlashback を実行しているユーザの権限を 再度確認した方が良いと思います。 以下、11.2 のセキュリティガイドのConnect ロールに関する説明です。 http://docs.oracle.com/cd/E16338_01/network.112/b56285/guidelines.htm#CHDFECGD

共感・感謝の気持ちを伝えよう!

質問者からのお礼

大変申し訳ありません、質問の文章が誤っておりました。 「1.ユーザー「test」を作成。権限はconnectロールのみ。」 と記載しましたが、実際にはCONNECT/MGMT_USER/OEM_MONITORの3つの権限がありました。 (以前、enterprise managerよりtestでインポート/エクスポートするとき、やはり権限関連でうまく動作せず、ロールを付与したり、どこかのサイトにのっていたストアドプロシージャを実行したりしました) 2,3,記載の通りt1は、test自身が作成したものになります。 また、念のためtestにさらにresourceロールを付与しましたが同様でした。 現在のtestの権限は以下の通りです。 ロール:CONNECT/MGMT_USER/OEM_MONITOR/RESOURCE(いずれもデフォルト) システム権限:FLASHBACK ANY TABLE オブジェクト権限:無し たびたびお手数をおかけしますが、情報ありましたらよろしくお願いします。

質問者からの補足

本件、原因は不明なままですが、いつの間にか実行できるようになっておりました。。。 関係ないと思いますが、実施した内容として大きなものはバックアップやファイル削除後のリカバリーなどを行っておりました。 若干すっきりしない点がありますが、回答いただきありがとうございました。

関連するQ&A

  • ORAー12560:TNS:protocol adapter error

    初心者です。ORACLE9iをインストールしました。コマンドラインから sqlplus /nolog SQL>connect /as sysdba と実行しますが、ERROR:ORAー12560:TNS:protocol adapter error となり接続出来ません。スタートメニューからSQL Plusを起動しても同エラーとなります。ORACLE関係のサービスは起動しており、ログインユーザはORACLEをインストールしたユーザでORA_DBAグループにも登録されています。OS再起動を実施しても同エラーです。OSはwindows2000Proです。どこをチェックすれば宜しいでしょうか。

  • お世話になってます。

    お世話になってます。 SQL初心者です。 現在、ORACLEでSQLを作成しているのですが、「ORA-00920」と「ORA-02063」が 発生し困っています。 「ORA-02063」の原因は調べてみると「ORA-00920」が原因の可能性があるみたいです。 「ORA-00920」のメッセージには「関係演算子が無効です。」とありますが、 調べてみてもよくわかりません。 実行するSQLは以下のような感じです。 ■SQL文 with テーブルA as( SELECT文   取得カラムA, 取得カラムB, 取得カラムC ), テーブルB as(   取得カラムA, 取得カラムB, 取得カラムC ) SELECT * FROM テーブルA A_TABLE, テーブルB B_TABLE WHERE A_TABLE.取得カラムA = B_TABLE.取得カラムA (+) AND A_TABLE.取得カラムB = B_TABLE.取得カラムB (+) AND A_TABLE.取得カラムC = B_TABLE.取得カラムC (+) ***ココマデ*** ビューの作成はうまくいっているのですが、 テーブルAとテーブルBを使用したSQL文でエラーになっているようです。

  • SQL Server(MSDE2000) : ALTER TABLE

    SQL Server(MSDE2000) : ALTER TABLE した項目に対し、直後に UPDATE で値をセットできない 既存のテーブルを仕様変更するため、列を追加し、初期値で埋める SQL 文を書こうとしていますが、うまく動かず、エラーとなってしまい、原因が判らず困っています。 サンプル SQL 文: ------ CREATE TABLE TEST_TABLE ( TEST_FIELD1 SMALLINT, TEST_FIELD2 SMALLINT) INSERT INTO TEST_TABLE VALUES( 1, 2 ) ALTER TABLE TEST_TABLE ADD TEST_FIELD3 SMALLINT UPDATE TEST_TABLE SET TEST_FIELD3 = 3 ------ ※テスト毎に、必ず DROP TABLE TEST_TABLE されている事が前提です。 上記 SQL 文のうち、1行目~3行目までを抜粋して実行すると、ちゃんと CREATE TABLE され、INSERT され、ALTER TABLE される事を確認しました。 ところが、4行目までを一気に実行しようとすると、 ------ SQL実行中に以下のエラーが発生しました。 エラーコード:207 [Microsoft][ODBC SQL Server Driver][SQL Server]列名 'TEST_FIELD3' は無効です。 SQLステータス:S0022 ------ となってしまい、UPDATE で初期値を埋める事ができません。 しかも、UPDATE に失敗するどころか、2行目の INSERT から以降が結果に反映されなくなるという状況に陥ってしまいます。 また、既存のテーブルの仕様変更が目的なので、その状況に近づけるために、まず、 ------ CREATE TABLE TEST_TABLE ( TEST_FIELD1 SMALLINT, TEST_FIELD2 SMALLINT) INSERT INTO TEST_TABLE VALUES( 1, 2 ) ------ を実行し、既存のテーブル(とレコード内容)が存在する状態を作り出された事を、ツール等で確認してから、 ------ ALTER TABLE TEST_TABLE ADD TEST_FIELD3 SMALLINT UPDATE TEST_TABLE SET TEST_FIELD3 = 3 ------ の2行を実行してみると、やはり UPDATE は失敗し、前述と同じエラーが発生します。 またこの場合、ALTER TABLE の実行結果も反映されていません。(つまり、TEST_FIELD3 が列追加されていない) もちろん、ALTER TABLE だけを実行した場合には、ちゃんと列は追加されます。 その後に、UPDATE を実行すれば、ちゃんと追加列に初期値がセットされます。 どうやら、「一回の SQL 文の実行の中で、ALTER TABLE によって新設した列に対しては、UPDATE などでのアクセスはすぐにはできない」のではないか?という状況のようなのです。一回の SQL 文の実行の中において、何らかのトランザクション動作っぽい挙動を感じます。 つまり、ALTER TABLE で追加された列は、その時点ではまだ完全にシステムに認知されていないため、直後の UPDATE 文で認識できずに失敗するのではないか?と。そして、そこでのエラー発生が、ロールバック的に実行した処理をキャンセルしてしまうため、結果として、ALTER TABLE が実行されなかった事になったり、INSERT が実行されなかった事になったりしているのではないか?と思う次第です。 考えられる回避策としては、SQL 文を別々に作成し、個別に実行すれば良いだけの事なのですが、できれば、SQL 文一つにまとめたいと考えています。 どなたか、こういった現象に対する原因・理由の説明、或いは回避策など、何か情報をお持ちの方はいらっしゃいませんでしょうか? 宜しくお願いします。

  • テーブルの権限 またはユーザの権限

    お世話になっております。 サーバーをいじること自体がはじめてで迷走しています; どうかご助言お願いします >< SQL Serverにおいて ユーザ「9999」がいるとします。 またDB「AA」「BB」「CC」「DD」があり、各DBに「9999」はログインできるようになっています。 各DB内にはそれぞれ複数のテーブルが存在します。 そして各テーブルでは「9999」に 「SELECT、INSERT、UPDATE、DELETE」の権限を与えてあります  ←今ココです そこで質問なのですが、 (1)ユーザ「9999」に与えてあるSELECT等の権限を確認するSQL文は存在しますでしょうか。   →「9999」がどのDBのどのテーブルにどの権限を持っているのか、など。 (2)もしくはDBごとに、どのユーザがどのテーブルに対してどの権限を持っているかを   確認するSQL文はありますでしょうか。   →テーブルごとでも結構です。 「権限を確認するSQLはあるよ」と 先輩に言われ、必死に探しておりますがOracleのものしか見つかりません。。。 とりあえず「9999」がそのテーブルに対して権限を持っているということを 証明したいのです。  ※テーブルのプロパティで権限付与を行ったため、    同じ方法で確認するのは意味がないと言われてしまいました どうかよろしくおねがいします。

  • ShellからTruncate【Linux】

    現在、ShellでSQL*PLUSを起動し、 テーブルをTruncateしようとしているのですが、 直接コマンドで実行すると可能なんですが、Shellで実行すると接続してすぐに切断されSQLが実行されません。 <Souce> ora_pass=TEST/TEST@DB log_pth=/home/oracle/TEST/04_log/ scrLOG=${log_pth}SHELL.log echo "S" sqlplus $ora_pass <<EOF > $scrLOG truncate table W_BSL_INV; EOF echo "E" ちなみにSelect文はscrLOGに正常に出力されます。

  • Sqlplusでの接続に関して

    掲示板利用させていただきます。 現在oracleのDBA1の勉強をしています。 sqlplusへ接続する際、as句を使用する意味がわかりません。 「connect sys/oracle as sysdba」の説明が、「sysdbaとして接続します」と参考書に書いています。 sysdbaは権限なのに、sysdbaで接続するとはどいういう意味なのでしょうか。sysユーザーにはsysdba権限が付与されているので、普通にas句を使わなくてもsysdba権限が必要な操作を実施可能と理解しています。 どなたかご教示いただけますでしょうか。

  • データベースリンクについて

    サーバーAからサーバーBにDB_LINKを作成し、サーバーBのテーブル(参照権限付与済)を参照しにいったところ、『ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。』となってしまいました。 またサーバーCにDB_LINKを作成したら何のエラーも発生しませんでした。 ちなみにSQLPLUSからサーバーBにログインは可能で、前述のテーブルも参照できました。しかしSQLPLUSからDBLINKを介しての参照は同じエラーになってしまいます。 ちなみに固定ユーザーでプライベート接続でリンクを作成しました。 相手サーバーにユーザーもIDも登録済みです。 いろいろ調べてみたのですが、全然わかりません。 ご存知の方がいらっしゃったら教えて下さい。 宜しくお願いします。

  • 無名ブロック内でのDDL実行について

    環境は Linux + oracle 10g R2です。 簡単な無名プロシージャを書いていてはまって しまいました。 分かる方でしたら、あっというまに指摘していただけそうなので こちらに質問しました。 無名ブロック内で以下の事を行いたいのですが、うまく動作を確認できません。 ※以下は意味の無い処理となっていますが、今回説明用に短くしてみました。 ◇実現したい事 1.CREATE TABLE文の実行 (ここではEX01テーブルを作成します) 2.CREATE したテーブルにたいしてINSERT 3.CREATE したテーブルのDROP ◇私の実行結果 $ sqlplus scott/tiger@orcl SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01'; レコードが選択されませんでした。 -- 私の思いでは以下のプロシージャは正常に動作するのでは? -- と思うのですが、以下の通りエラーとなってしまいます。 -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); 4 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 5 END; 6 / INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); * 行3でエラーが発生しました。: ORA-06550: 行3、列13: PL/SQL: ORA-00942: 表またはビューが存在しません。 ORA-06550: 行3、列1: PL/SQL: SQL Statement ignored -- -- なので、処理を分割して行ってみました。 -- まずはCREATE TABLEのみ -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('CREATE TABLE EX01 ( C1 NUMBER,C2 VARCHAR2(10))'); 3 END; 4 / PL/SQLプロシージャが正常に完了しました。 -- -- CREATE TABLEは正常に動作したようです。 -- SQL> INSERT INTO EX01(C1,C2) VALUES(1,'AAA'); 1行が作成されました。 -- -- INSERT文も正常に動作したようです。 -- SQL> BEGIN 2 DBMS_UTILITY.EXEC_DDL_STATEMENT('DROP TABLE EX01'); 3 END; 4 / PL/SQLプロシージャが正常に完了しました。 -- -- なんとDROP TABLEも正常に動作したようです。 -- SQL> SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME ='EX01'; レコードが選択されませんでした。 SQL> そうなんです。3行まとめて記載するとエラーとなるのですが、 上記の通りそれぞれ分けて実行すると正常に動作するのです。 これはどこが悪いのでしょうか? 情けない事に、今日の午後はこれでほとんどつぶれてしまいました。 どなたか助けてください。 以上よろしくお願いします。

  • FILE権限があるはずなのにSQLファイルを実行出来ない

    MySQL 3.23.58(Linux)です。 testというデータベースを作成し、ユーザtestuserにこのtestデータベースへのFILE権限やUPDATE権限など一通り持たせています。 ユーザ「testuser」でMySQLにログインし、use test;とすると、Database Changedと出てデータベースの編集が可能になるのですが、 mysql -u testuser -p ***** test < backup.sql この様にbackup.sqlというSQLファイルを実行しようとすると、ERROR 1044のアクセス権限がありませんエラーが表示されてしまいます。 SQLファイルをtestデータベースに反映させるにはどうすればいいでしょうか?

  • 漢字名のテーブルとカラムのCREATE TABLEについて

    Oracle9iで以下のCREATE文を実行しようと思っています。 漢字名のテーブルで、漢字名のカラムのあるCREATE文です。 SQL> CREATE TABLE "TAB_あいう"( 2 "かきコード" varchar2(5) NOT NULL , 3 "くけ開始月" varchar2(2) NOT NULL , 4 "フラグ" char(1) NOT NULL , 5 "さCD" char(6) NOT NULL , 6 "日時" date NOT NULL , 7 canstraint PK_FISCALTERM primary key ("かきコード")); canstraint PK_FISCALTERM primary key ("かきコード"))                            * 行7でエラーが発生しました。: ORA-00907: 右カッコがありません。 しかし、 ORA=00907;右カッコがありません。といわれてしまいます。 見た目、右かっこはあります。 なにか、お作法的なものがあるのでしょうか?