sql - SELECT ANY TABLE 权限如何在 Oracle 中工作?

标签 sql oracle privileges

我想知道特权 SELECT ANY TABLE 在 Oracle 内部是如何工作的。

它是否被视为单一特权?还是等同于为每个表创建一个 GRANT SELECT ON MyTable TO MyUser

例如,我想知道这是否有效:

GRANT SELECT ANY TABLE TO PUBLIC;
REVOKE ALL ON MY_TABLE FROM PUBLIC;

在这些查询之后,我是否仍然可以从任何用户那里访问 MY_TABLE

最佳答案

是的,所有用户仍然可以查询 MY_TABLE

您正在寻找不同的 privilege types :

The main types of user privileges are as follows:

  • System privileges—A system privilege gives a user the ability to perform a particular action, or to perform an action on any schema objects of a particular type. For example, the system privilege CREATE TABLE permits a user to create tables in the schema associated with that user, and the system privilege CREATE USER permits a user to create database users.
  • Object privileges—An objectprivilege gives a user the ability to perform a particular action on a specific schema object. Different object privileges are available for different types of schema objects. The privilege to select rows from the EMPLOYEES table or to delete rows from the DEPARTMENTS table are examples of object privileges.

SELECT ANY TABLE是一种系统特权,允许被授权者:

Query tables, views, or materialized views in any schema except SYS. Obtain row locks using a SELECT ... FOR UPDATE.

当您授予它是独立的单一权限时,在 dba_sys_privs 中可见。当 Oracle 决定是否允许用户访问表时,它可以首先查看系统权限,如果没有系统权限,则仅继续查找特定对象权限(在 dba_tab_privs 中可见)允许正在执行的操作。

系统权限不会转换为数据库中每个对象的单独权限 - 维护这将是可怕的,因为创建一个新对象必须根据系统权限自动确定谁应该被授予权限;这意味着您无法区分该特权和单独授予的特权。因此,例如,如果您明确授予特定表上的 select privs,则授予用户 SELECT ANY TABLE,然后他们已撤销 SELECT ANY TABLE - 会发生什么到之前的明确授权?

您的方案基本相同,只是您已指定要撤销的对象的所有权限。如果仅涉及这两个命令,则 PUBLICMY_TABLE 没有明确的权限,因此撤销实际上并没有做任何事情;但如果已授予该表的任何显式特权,则它们将被撤销。不过,这对更高级别的 SELECT ANY TABLE 系统权限没有影响。

特权是累积的;撤销对特定对象的权限不会阻止对该对象的访问,它只会删除一个可能的访问路径。

顺便说一句,希望您使用了一个人为的示例,因为应该谨慎授予如此强大的系统权限,并且 only when really needed .让任何用户查询数据库中的任何表都可能会在安全模型中造成一个大漏洞。再次from the docs :

Oracle recommends that you only grant the ANY privileges to trusted users

Oracle recommends against granting system privileges to PUBLIC.

并在 the database security guide 中阅读更多内容.

关于sql - SELECT ANY TABLE 权限如何在 Oracle 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53260312/

相关文章:

postgresql - 允许一些角色更新列,如果它是 NULL,则允许其他一些角色

mysql - 远程访问数据库

linux - ARM Linux下的特权模式

c# - 为什么 DateTime.Now 在 asp.net c# 中保存到 SQL YYYY-DD-MM?

mysql: 'r' 是什么意思?

sql - 在选择语句中使用 CLOB 分组

eclipse - 未找到 Oracle 驱动程序

sql - (Oracle)SQL中的正则表达式,用于将日期/时间拆分为单独的日期和时间列

php - 从表中获取多个ID的最后插入数据?

oracle - 在数据库中实现 "Both, Either-or, but Not Null"要求