数据库管理-第227期 Oracle中的public(20240808)

数据库管理-第227期 Oracle中的public(20240808)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database(Oracle与MySQL)
PostgreSQL ACE Partner
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,HaloDB外聘技术顾问,OceanBase观察团成员,青学会MOP技术社区(青年数据库学习互助会)技术顾问
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭

今天在小群里面大家做互相感谢的时候,首席想用grant dba to来表达感谢,我觉得应该grant thanks to public。public是Oracle数据库中一个比较特殊的存在。

1 public是什么

我在什么地方用的最多呢,就是在OCM考试/培训的时候,比如新建一个directory,作为偷懒就想把directory的权限给public,那么后面无论使用system还是具体用户做相关操作(比如expdp/impdp)都不用再精细化赋权了,那么我们看看官方文档(19c)对public的解释:
在官方文档SQL Language Reference的GRANT章节(https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/GRANT.html)中:

PUBLIC
Specify PUBLIC to grant the privileges to all users. Oracle recommends against granting system privileges to PUBLIC.
指定PUBLIC来将权限授予到所有用户。Oracle不建议将系统权限赋予给PUBLIC。

这里可以看出PUBLIC指代的就是数据库中的全部用户。好玩的一点是,通过下面语句是找不到PUBLIC跟用户的相关信息:

select username from dba_users where username='PUBLIC';
elect role from dba_roles where role='PUBLIC';
select synonym_name from dba_synonyms where synonym_name='PUBLIC';

image.png
但是在EMCC中的用户里是可以看到PUBLIC:
image.png
但是从dba_objects里面可以查到owner为PUBLIC的相关对象,且全都是synonym同义词:

select count(*) from dba_objects where owner='PUBLIC';
select distinct(object_type) from dba_objects where owner='PUBLIC' group by object_type;

image.png
而在23ai中,对应同义词的数量还多了一些:
image.png

2 单库/PDB展示

这里在PDB里面做个操作展示:

create user test identified by test;
grant connect to test;
select * from DBA_SYS_PRIVS where grantee='TEST';
grant create procedure to public;
select * from DBA_SYS_PRIVS where grantee in ('PUBLIC','TEST');

image.png
这里可以看到用户test并没有实际授权,PUBLIC则得到了授权。进一步测试:
image.png
连接到test用户,是可以创建存储过程的。如果从public回收创建存储过程的权限,则该用户就无法创建存储过程:

revoke create procedure from public;

image.png
image.png

3 多租户展示

这里尝试在CDB中进行风险操作:

alter session set container=pdbprod1;
select * from DBA_SYS_PRIVS where grantee='PUBLIC';

alter session set container=cdb$root;
grant create procedure to public container=all;
select * from DBA_SYS_PRIVS where grantee='PUBLIC';

alter session set container=pdbprod1;
select * from DBA_SYS_PRIVS where grantee='PUBLIC';

image.png
image.png
这里可以看到在多租户环境中是可以通过CDB想PDB进行授权的。

总结

本期简单介绍了下Oracle中的PUBLIC这个特殊用户。
老规矩,知道写了些啥。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖头鱼的鱼缸(尹海文)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值