环境立即授于查看管理权限根据人物角色来授于查看管理权限近义词的应用

环境

如今有一个客户A想把这个客户A下的全部表查看管理权限都给客户x,该怎么办?一样的难题,如果有4个客户A,B,C,D,就需要把这4个客户下边全部表的写保护管理权限给客户X,Y,z,该怎么办?

在MySQL5.7中,能够建立客户X,随后将a *上的select授于X,将每一个库下的全部表受权给客户X,在MySQL8.0版本号中,拥有人物角色的定义,大家只必须给四个ABCD库下的全部表授予一个写保护人物角色,随后将这一写保护人物角色授予XYZ三个客户。

可是,在Oracle中,沒有类似MySQL的根据方式等级的受权,仅有每一个客户下边的每一个表才能够独立受权。有这两种方式还可以完成Oracle写保护客户受权。

立即授于查看管理权限。

受权的立即方法是将某一客户下全部数据库查询目标的相对应管理权限受权给另一个客户。使我们演试下边的实际完成全过程,并将客户mydb下全部表的写保护管理权限受权给my_ro_user。

下列实际操作全是应用系统软件客户实行的。

建立一个写保护的用my_ro_usercreate user my_ro_user identified by "my_ro_user";给写保护的客户授于联接管理权限grant create session to my_ro_user;把mydb下边的userinfo表的写保护管理权限受权给my_ro_user客户grant select on mydb.userinfo to my_ro_user;

上边只受权mydb下的一个表给my_ro_user。如果我们必须将mydb下的全部表受权给my_ro_user,应该怎么办?mydb上沒有grant select那样的涵数。*到Oracle中的my _ ro _ user,而且只有特定每一个数据库查询目标的名字。依照下边的方式,mydb下每一个表的查看管理权限能够循环系统授于my_ro_user。

BEGIN -- FOR t IN (SELECT * FROM user_tables) FOR t in (SELECT owner, object_name, object_type FROM all_objects WHERE owner = UPPER('mydb') AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')) LOOP -- EXECUTE IMMEDIATE 'GRANT SELECT ON ' || t.table_name || ' TO my_ro_user'; IF t.object_type IN ('TABLE','VIEW') THEN EXECUTE IMMEDIATE 'GRANT SELECT ON '||t.owner||'.'||t.object_name||' TO my_ro_user'; -- ELSIF t.object_type IN ('PROCEDURE','FUNCTION','PACKAGE') THEN -- EXECUTE IMMEDIATE 'GRANT DEBUG ON mydb.'||t.object_name||' TO my_ro_user'; END IF; END LOOP;END;

进行以上受权实际操作后,大家可以用新用户my_ro_user登陆Oracle数据库查询后,查看mydb客户下列中的数据信息。

* *留意:*这时,在my_ro_user下执行查询句子时,必须特定登录名mydb,而且必须在全部表的前边加上mydb。该字符串数组能够查看相匹配的表,不可以立即从userinfo实行select *;,从mydb.userinfo中挑选*必须实行;仅有那时候。假如你要写字符串数组mydb。,能够查看相对应的表。大家必须授于my_ro_user建立近义词的管理权限,随后在my_ro_user下建立近义词以省去登录名。

用system客户给my_ro_user客户授于建立近义词的管理权限。grant create synonym to my_ro_user;用my_ro_user登陆Oracle随后实行如下所示句子,将SQL句子的結果拷贝出去实行就可以大批量建立派出所有的同义词。select 'create or replace synonym my_ro_user.' || object_name|| ' for ' || owner || '.' || object_name|| ';' ,'drop synonym my_ro_user.' || object_name|| ';' from dba_objectswhere owner in upper('mydb')and object_type='TABLE';

在实行以上SQL的結果集以后,my_ro_user不用特定mydb。查看mydb客户下边的表时的字符串数组。

根据人物角色授于查看管理权限。

建立一个人物角色,随后向该人物角色授于对数据库查询下边的表的管理权限,随后向客户授于该人物角色。那样,客户能够以特殊的人物角色浏览特殊数据库查询下的表。

落实措施方法如下所示:

建立写保护人物角色create role my_readonly_role;将数据库查询下边全部的表受权给人物角色/*mydb是Oracle的数据库查询名字,也是客户名字,userinfo是mydb下边的表,my_readonly_role是一个游戏角色名字*/grant select on mydb.userinfo to my_readonly_role;

上边的方式很不便,由于必须为每一个表各自受权人物角色。这儿有一个迅速处理受权全过程的方式。

BEGIN -- FOR t IN (SELECT * FROM user_tables) FOR t in (SELECT owner, object_name, object_type FROM all_objects WHERE owner = UPPER('sunny_cmd') AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')) LOOP -- EXECUTE IMMEDIATE 'GRANT SELECT ON ' || t.table_name || ' TO my_readonly_role'; IF t.object_type IN ('TABLE','VIEW') THEN EXECUTE IMMEDIATE 'GRANT SELECT ON '||t.owner||'.'||t.object_name||' TO my_readonly_role'; -- ELSIF t.object_type IN ('PROCEDURE','FUNCTION','PACKAGE') THEN -- EXECUTE IMMEDIATE 'GRANT DEBUG ON mydb.'||t.object_name||' TO my_readonly_role'; END IF; END LOOP;END;

在上面的SQL句子块中,应用了查看特殊客户下全部数据库查询目标的如何查询。假如要查看某一客户下列的全部数据库查询目标,能够应用下列SQL句子:

/*查看mydb客户下边全部的数据库查询目标,包含表,主视图,sql语句,涵数,包。*/SELECT * FROM all_objects WHERE owner = UPPER('mydb') AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')建立写保护客户create user my_ro_user identified by "my_ro_user";给创好的客户授权登录的管理权限grant create session to my_ro_user;把写保护人物角色授于创好的写保护客户grant my_readonly_role to my_ro_user;

近义词的应用。

在我们在写保护客户下浏览别的用户下具备写保护管理权限的表时,假如不愿在SQL句子中特定别的登录名,必须在当今写保护客户下创建表的近义词,那样这一近义词就可以全自动偏向别的用户下相匹配的表,那样就可以在写保护客户下立即应用表名,而不用在每一个表名中加上登录名。

前提条件是当今写保护客户对另一个客户下的表有写保护管理权限,随后还可以在当今写保护客户下建立近义词;不然,只需近义词沒有相对的访问限制,就不可以根据近义词浏览相对应的数据分析表。

评论(0条)

刀客源码 游客评论