撤消Oracle中表的权限

时间:2014-10-15 12:55:09

标签: sql oracle oracle10g privileges

我正在尝试使用查询

撤销Employee表的SELECT权限
  

REVOKE SELECT ON ODS_INSTALL.employee FROM ODS_INSTALL;

目前,我已作为SYSTEM用户连接,但在连接到ODS_INSTALL并将查询解除为:

  

从员工中选择*;

我正在获取输出,但它应该给出关于权限不足的错误。 可能是什么问题?

1 个答案:

答案 0 :(得分:3)

在Oracle中,架构 是用户,据我所知,您不能REVOKE对其所有者的表进行特权。

奇怪你没有错误,就像我的测试系统(Oracle 11g)一样:

(as system)
SQL> revoke select on sylvain.n from sylvain
*
ERROR at line 1:
ORA-01927: cannot REVOKE privileges you did not grant
(as sylvain)
SQL> revoke select on n from sylvain;
revoke select on n from sylvain
                        *
ERROR at line 1:
ORA-01749: you may not GRANT/REVOKE privileges to/from yourself

(之前发出GRANT不会改变任何内容)

基本上,对象权限旨在授予/撤消对其他用户的 对象的访问权限。也许您应该将表移动到专用模式,并将插入/更新/删除授予该模式中的ODS_INSTALL


如果确实需要限制对用户自己的表的访问权限,我能看到的唯一方法是使用Virtual Private Database。从广义上讲,您将write a function that dynamically generate an extra WHERE clause Oracle将自动附加到每个用户查询。

CREATE OR REPLACE FUNCTION auth_orders( 
  schema_var IN VARCHAR2,
  table_var  IN VARCHAR2
 )
 RETURN VARCHAR2
 IS
  return_val VARCHAR2 (400);
 BEGIN
  RETURN '1=0'; -- always false: "hide" all rows
 END auth_orders;
/

使用以下方法安装:

BEGIN
  DBMS_RLS.ADD_POLICY (
    object_schema    => 'ODS_INSTALL',
    object_name      => 'employee',
    policy_name      => 'orders_policy',
    function_schema  => 'sys',
    policy_function  => 'auth_orders',
    statement_types  => 'select'
   );
END;

查看Is to possible to forbid access to tables in own schema - Oracle? [dba se]了解一些细节。