接上篇:https://developer.aliyun.com/article/1223095?spm=a2c6h.13148508.setting.19.44ec4f0eNvAByn
在Oracle下,用户与模式一一对应。比如“scott用户下的emp表”严谨的表述方式应为“scott模式下的emp对象”。
而PolarDB下,一个用户可以有多个模式。比如scott用户下有sport和art两个模式,其中sport模式下有篮球、羽毛球、乒乓球三张表,art模式下有钢琴、小提琴、手风琴三张表。如果不指定模式,则scott下的所有表都属于public模式。
如果想要沿用与Oracle一样的模式,在用户下创建一个与用户名一致的模式即可。
实现方式如上图所示,先创建两个模式。创建表的时候,如果希望将篮球表分至体育模式下,则创建语句写为create table sport.lanqiu()。
分别在两个模式下建了不同的表以后,用\d查看会发现无法查询。因为默认情况下PolarDB的搜索路径是与用户名一致的模式以及public模式。
因此,需要将search_path加上sport和art,方可成功查询。
如果要将某个模式下表的数据给某个用户访问,首先要先将模式的访问权限赋予用户,再将表的访问权限赋予用户。
如上图,对u3赋予select权限后,访问art模式下的gangqin表,显示访问被拒绝。因为该用户没有访问art模式的权限。
对u3赋予usage权限后方可访问。
综上,如果访问特殊模式,不是public模式,授权时需要分两步:首先,将模式的权限赋予用户,其次,将模式下对象的权限赋予用户。
数据字典namespace里包含了所有模式的名字以及模式下分配给用户的权限。
上图为为对象级别赋予权限的语法。
比如要使用u3访问u2下的t1表,需要执行grant select on t1 to t3。
如果该表不属于public模式,则需要先将模式的访问权限赋予用户,再将模式下的对象权限赋予用户。
上图为对象级别的权限示例。
上图为表的权限含义。
将权限赋予用户以后,可以通过psql的\z或\dp查看查看当前有哪些可访问的权限。
查询结果显示如上图。
比如u3=r/u2代表u3拥有r的权限且属于u2。
执行grant all on t1 to u3将t1的所有权限赋予u3,然后通过\z查询,结果如上图,u3=arwdDxt/u2,代表u3拥有了所有权限。
撤销权限可通过REVOKE语法,示例如上图。
比如,执行revoke all on t1 from u3后,结果如上图,原先t1赋予u3的权限全部被撤销。