Flashback Tableで必要な権限とは?

このQ&Aのポイント
  • テーブルの過去データを復元できるFlashback Tableを実行するためにはどのような権限が必要なのでしょうか?
  • 自分のテーブルであれば権限は不要と思ったのですが、実際にはどのような権限が必要なのかについて調査しました。
  • No.5とNo.8でエラーが発生した原因についても考察しています。
回答を見る
  • ベストアンサー

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でエラーとなってしまったのは、どこに問題があったものでしょうか。 何か情報ありましたら教えてください。

  • Oracle
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

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

narenai_se
質問者

お礼

回答ありがとうございます。 私の方でもマニュアルの方は確認しまして、たとえば別ユーザー(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を付与しても同様でした。 的外れかもしれませんが、ディクショナリ関連の権限が必要かと推測しています・・・。 他になにか情報ありましたら教えてください。

その他の回答 (1)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答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

narenai_se
質問者

お礼

大変申し訳ありません、質問の文章が誤っておりました。 「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 オブジェクト権限:無し たびたびお手数をおかけしますが、情報ありましたらよろしくお願いします。

narenai_se
質問者

補足

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

関連するQ&A

  • Oracle テーブルの列削除

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

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

    お世話になっております。 サーバーをいじること自体がはじめてで迷走しています; どうかご助言お願いします >< 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」がそのテーブルに対して権限を持っているということを 証明したいのです。  ※テーブルのプロパティで権限付与を行ったため、    同じ方法で確認するのは意味がないと言われてしまいました どうかよろしくおねがいします。

  • 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です。どこをチェックすれば宜しいでしょうか。

  • 参照権限の付与方法

    環境は、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; のように、全ての表、ビューを参照権限を与えることはできるでしょうか?

  • sqlplus / as sysdba で接続不可

    OS: CentOS-6.3 (64 bit) はじめまして Oracle Express Edition (11g Release2) を使って Oracle の勉強を始めた者です。 dba グループに属するユーザでログインし、端末から sqlplus / as sysdba と入力しても、 ERROR: ORA-12547: TNS: 接続を失いました。 となってしまいます。 その後、ユーザ名とパスワードを入力すると、接続できます。 このエラーが出ないようにするには、どうすればいいでしょうか? よろしくお願いします。 _________________________________ [oracle_admin@dell-t108 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.2.0 Production on 月 8月 6 17:41:06 2012 Copyright (c) 1982, 2011, Oracle. All rights reserved. ERROR: ORA-12547: TNS: 接続を失いました。 ユーザー名を入力してください: sys@xe as sysdba パスワードを入力してください: Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production に接続されました。 SQL> SQL> select count(*) from hr.employees; COUNT(*) ---------- 107 SQL> exit Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionとの接続が切断されました。 [oracle_admin@dell-t108 ~]$ id uid=502(oracle_admin) gid=501(dba) 所属グループ=501(dba) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [oracle_admin@dell-t108 ~]$

  • 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

  • Sqlplusでの接続に関して

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

  • 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 テーブル削除

    教えてください。 あるテーブルをエクスポートする際にエクスポートエラー が出ます。(このエラーは承知でエラーを出しています。)その際にエクスポートエラーのテーブルが作成されますが、このテーブルをSQLのDROP文で削除したいのですが テーブル名がエクスポートvエラー(v=スペースです。) になってしまいます。 例)T_1_エクスポートvエラー このテーブルを削除しようと  DROP TABLE T_1_エクスポートvエラー ってSQLを書くとT_1_エクスポートが見つかりませんとエラーになってしまいます。 どうしたら、このテーブルを削除できるでしょうか? それとも、エクスポートエラーのテーブルを作成させない設定ってあるんでしょうか? わかりにくい説明でごめんなさい。 よろしくお願いします。

  • Access_log0テーブルの閲覧方法

    OS:Solaris8 Oracle8.1.7 「Access_log0」テーブルの閲覧はどういう方法でできるのでしょうか? sqlplusに system/manager@XXXX でログインしてもSELECT文では見れないようなのですが… SELECT * FROM ACCESS_LOG0 * 1行でエラーが発生しました。 ORA-00942:表またはビューが存在しません。 私はOracleをカジった程度の知識です。 必要な情報は捕捉致しますので、 皆様よろしくお願いします。