【问题标题】:Revoking privileges for a Table in Oracle在 Oracle 中撤销表的权限
【发布时间】:2014-10-15 12:55:08
【问题描述】:

我正在尝试使用 Query 撤销 Employee 表的 SELECT 权限

REVOKE SELECT ON ODS_INSTALL.employee FROM ODS_INSTALL;

目前我以SYSTEM 用户身份连接,但在连接到ODS_INSTALL 并触发查询后:

从员工中选择 *;

我得到了输出,但它应该给出一个关于权限不足的错误。 可能是什么问题?

【问题讨论】:

  • 哪个架构包含您的EMPLOYEE 表?您的查询看起来像这样,您可能在两种模式中都有一个。而且 AFAIK 你不能 REVOKE 对其所有者的表的特权。
  • @FrankSchmitt EMPLOYEE 表在 ODS_INSTALL 模式下,我触发的实际查询是 REVOKE SELECT ON ODS_INSTALL.employee FROM ODS_INSTALL; 超级用户不能从表中“撤销”权限吗?
  • 表的所有者始终拥有完整的授权 - 并且无法撤销。如果您不希望 ODS_INSTALL 拥有该表的权限,则必须将其移至不同的架构。

标签: sql oracle oracle10g privileges


【解决方案1】:

在 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]了解更多详情。

【讨论】:

  • 如果我们在撤销之前触发 GRANT 查询会怎样
  • @Abhishek 没有改变任何东西:grant select on sylvain.n to sylvain => 授予成功。 revoke select on sylvain.n from sylvain; => ORA-01927: 无法撤销您未授予的权限
  • 我是谁(在 Oracle 10g 上)GRANT 查询然后REVOKE 我得到revoke succeeded 但是一旦我更改用户以查看权限是否被撤销,我我仍然能够访问Employee 表的数据
  • 我正在使用其他用户来撤销权限。在我的场景中(作为 SYSTEM)我正在解雇 GRANT然后 REVOKEon ODS_INSTALL user
  • @Abhishek 我不能告诉你更多,因为我手头没有 Oracle 10。我怀疑这会起作用。也许甲骨文公司只是修复 GRANT/REVOKE 在 11g 上的行为以正确报告失败?我只能鼓励你等几个小时,也许有人会给出更好的答案......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2021-03-03
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多