4

データベースのユーザー権限を合理化しています。そのために、すべてのユーザーに付与されたスキーマ内のすべてのテーブル(特定の役割ではない)のすべての選択権限を取り消したいと考えています。

いくつかの正規表現を使用して、revoke次のようなものを与える各テーブルのユニバーサルを作成しようとしました。

TABLE1のselectをUSER1、USER2、USER3...から取り消します。

TABLE2のselectをUSER1、USER2、USER3...から取り消します。

ただし、すべてのユーザーにすべてのテーブルへのアクセス許可が付与されているわけではないため、これによりoracleエラーが発生します。

01927. 00000 - "cannot REVOKE privileges you did not grant"

これは理にかなっていますが、役に立ちません。


また、を使用して、取り消す必要のある許可が含まれるすべてのテーブルのリストを取得しようとしAll_Tab_Privsましたが、これは機能しますが、これから実際にアクセス許可を取り消す方法がわかりません。

SELECT * From All_Tab_Privs where grantor = 'GRANTING_USER' and grantee != 'READROLE' and grantee != 'PUBLIC' and grantee != 'SYS';

スプレッドシートで何時間も費やさずにこれを行う方法についての提案はありますか?PL / SQLを推測していますか?ありがとう。

4

4 に答える 4

4
-- Revoke Privs Granted to Users
BEGIN
  FOR r IN (SELECT * FROM all_tab_privs WHERE grantee IN ('USER_1', 'USER_2'))
    LOOP
      EXECUTE IMMEDIATE 'REVOKE '||r.privilege||' ON '||r.table_name||' FROM '||r.grantee;
    END LOOP;
END;
/
于 2014-06-03T15:17:31.383 に答える
4

この種のジョブの一般的なパターンは、暗黙カーソルを使用して必要なデータを返し、DDL を構築して実行することです。

begin
  for x in (select attribute_1, attribute_2 ... from ... where ...)
  loop
    execute immediate 'REVOKE ...'||x.attribute1||' etc';
  end loop;
end;
/

別の良い方法は、実行したい SQL を SELECT で作成し、それを実行することです。テストは簡単ですが、SQL は少しぎこちなく見えます。

于 2012-05-11T12:32:42.263 に答える
3

一部の PL/SQL および動的 SQL:

begin
    for r in (SELECT * From All_Tab_Privs 
              where grantor = 'GRANTING_USER' 
              and grantee != 'READROLE' 
              and grantee != 'PUBLIC' 
              and grantee != 'SYS')
     loop
        execute immediate 'revoke '||r.privilege||' from '||r.grantee;
    end loop;
end;
于 2012-05-11T12:33:25.133 に答える
2

私のデータベースには非常に興味深い状況がありました。オラクル独自のSQL Developerは、テーブルから削除されていましたが、各テーブルの既存の許可をリストしましたall_tab_privsSELECTは、検索された被付与者に対して結果をもたらしませんでした)。

次の構成を使用して修正しました。

BEGIN
  FOR r IN (SELECT owner, table_name FROM dba_tables WHERE owner IN ('owner1', 'owner2'))
    LOOP
      EXECUTE IMMEDIATE 'REVOKE ALL ON '||r.owner||'.'||r.table_name||' FROM grantee1, grantee2';
    END LOOP;
END;
/

これにより、最初に、特定の所有者の各テーブルからすべての所有者とテーブル名が選択されます。次に、特定の被付与者に対するすべての付与を取り消します。

良いことは、選択したテーブルの 1 つに対してリストされた被付与者の 1 つに付与がなくても、これは失敗しないということです。

これはsystemなどの管理者アカウントから実行する必要があることに注意してください。そのため、現在のユーザーは別のユーザーのテーブルに対する許可を取り消す権利を持っています。

于 2016-02-17T09:01:59.777 に答える