找回密码
 立即注册
首页 业界区 安全 Oracle如何找出一个表的间接授权信息?

Oracle如何找出一个表的间接授权信息?

峰邑 2025-9-25 20:55:13
在Oracle数据库中, 如果需要找出一张表授权给了哪一个用户,这个比较简单的,如果有一些视图引用了这张表,然后这张视图授权给了其它用户的话, 那么这也属于这张表的授权信息,如果也要找出这类信息,那么如何找出来这些信息呢?
下面简单看一个例子, 在数据库中存在三个用户T1, T2, T3, 假设T1用户将表T1.TEST的查询权限授予了用户T2.
  1. create user t1 identified by t123456;
  2. create user t2 identified by t234561;
  3. create user t3 identified by t345612;


  4. alter user t1 quota unlimited on users;
  5. alter user t2 quota unlimited on users;
  6. alter user t3 quota unlimited on users;


  7. grant connect, resource to t1;
  8. grant connect, resource to t2;
  9. grant connect, resource to t3;


  10. grant create view to t2;
  11. grant create view to t3;
复制代码
具体授权操作如下所示:
  1. SQL> show user;
  2. USER is "T1"
  3. SQL> create table test(id number(10), name varchar2(30));

  4. Table created.
  5. SQL> insert into test
  6.   2  select 1, 'k1' from dual union all
  7.   3  select 2, 'k2' from dual;

  8. 2 rows created.

  9. SQL> commit;

  10. Commit complete.

  11. SQL>
  12. SQL> grant select on test to t2;

  13. Grant succeeded
复制代码
那么此时查看关于表TEST的授权信息如下所示:
  1. SET LINESIZE 820;
  2. COL GRANTEE FOR A12
  3. COL OWNER FOR A12
  4. COL TABLE_NAME FOR A12
  5. COL GRANTOR FOR A12
  6. COL PRIVILEGE FOR A12
  7. SELECT OWNER, TABLE_NAME, GRANTOR , GRANTEE, PRIVILEGE, GRANTABLE, TYPE 
  8. FROM DBA_TAB_PRIVS WHERE TABLE_NAME='TEST';
复制代码
  1. SQL> show user;
  2. USER is "SYS"
  3. SQL> SET LINESIZE 820;
  4. SQL> COL GRANTEE FOR A12
  5. SQL> COL OWNER FOR A12
  6. SQL> COL TABLE_NAME FOR A12
  7. SQL> COL GRANTOR FOR A12
  8. SQL> COL PRIVILEGE FOR A12
  9. SQL> SELECT OWNER, TABLE_NAME, GRANTOR , GRANTEE, PRIVILEGE, GRANTABLE, TYPE 
  10.   2  FROM DBA_TAB_PRIVS WHERE TABLE_NAME='TEST';

  11. OWNER        TABLE_NAME   GRANTOR      GRANTEE      PRIVILEGE    GRA TYPE
  12. ------------ ------------ ------------ ------------ ------------ --- ------------------------
  13. T1           TEST         T1           T2           SELECT       NO  TABLE

  14. SQL> 
复制代码
如果用户T1将表TEST的查询权限授予了用户T2,并且使用了选项GRANT OPTION的话
  1. SQL> show user;
  2. USER is "T1"
  3. SQL> grant select on test to t2 with grant option;

  4. Grant succeeded.

  5. SQL> 
复制代码
那么此时,如果在T2用户下面创建一个视图,引用表TEST, 然后将视图T2.V_TEST的查询权限授权给了用户T3.
  1. SQL> show user;
  2. USER is "T2"
  3. SQL> create or replace view v_test
  4.   2  as
  5.   3  select name from t1.test;

  6. View created.
  7. SQL> grant select on t2.v_test to t3;

  8. Grant succeeded.

  9. SQL> 
复制代码
此时用户T3就相当间接拥有了表TEST的查询权限. 如下所示:
  1. SQL> show user;
  2. USER is "T3"
  3. SQL> select * from t2.v_test;

  4. NAME
  5. ------------------------------
  6. k1
  7. k2

  8. SQL> 
复制代码
但是,我们用上面的SQL来查询一下表TEST授予了哪些用户.如下所示, 这个查询结果不能体现表TEST间接授权给了用户T3
  1. SQL> show user;
  2. USER is "SYS"
  3. SQL> SET LINESIZE 820;
  4. SQL> COL GRANTEE FOR A12
  5. SQL> COL OWNER FOR A12
  6. SQL> COL TABLE_NAME FOR A12
  7. SQL> COL GRANTOR FOR A12
  8. SQL> COL PRIVILEGE FOR A12
  9. SQL> SELECT OWNER, TABLE_NAME, GRANTOR , GRANTEE, PRIVILEGE, GRANTABLE, TYPE 
  10.   2  FROM DBA_TAB_PRIVS WHERE TABLE_NAME='TEST';

  11. OWNER        TABLE_NAME   GRANTOR      GRANTEE      PRIVILEGE    GRA TYPE
  12. ------------ ------------ ------------ ------------ ------------ --- ------------------------
  13. T1           TEST         T1           T2           SELECT       YES TABLE

  14. SQL> 
复制代码
那么问题来了,如何查询这种情况下的授权呢? 其实我们可以用下面SQL实现这个需求.如下所示:
  1. SET LINESIZE 820
  2. COL OWNER FOR A10
  3. COL TABLE_NAME FOR A16;
  4. COL GRANTOR FOR A16
  5. COL GRANTEE FOR A16
  6. COL PRIVILEGE FOR A8;
  7. SELECT OWNER, TABLE_NAME, GRANTOR , GRANTEE, PRIVILEGE, GRANTABLE, TYPE 
  8. FROM DBA_TAB_PRIVS 
  9. WHERE TABLE_NAME=UPPER(TRIM('&tb_name'))
  10. UNION ALL
  11. SELECT  OWNER, TABLE_NAME, GRANTOR , GRANTEE, PRIVILEGE, GRANTABLE, TYPE  
  12. FROM DBA_TAB_PRIVS 
  13. WHERE TABLE_NAME IN(
  14. SELECT  NAME FROM dba_dependencies WHERE 
  15. REFERENCED_NAME=UPPER(TRIM('&tb_name')) AND TYPE='VIEW'
  16. );
复制代码
1.webp
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册