我正在尝试使用查询
撤销Employee表的SELECT
权限
REVOKE SELECT ON ODS_INSTALL.employee FROM ODS_INSTALL;
目前,我已作为SYSTEM
用户连接,但在连接到ODS_INSTALL
并将查询解除为:
从员工中选择*;
我正在获取输出,但它应该给出关于权限不足的错误。 可能是什么问题?
答案 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]了解一些细节。