通过Oracle 12c中的角色授予用户权限的问题

我开始学习Oracle 12c了,请原谅我的坏术语.我写了这个基本脚本来设置用户和权限:

CREATE USER wertyq_db_usr IDENTIFIED BY justatest ACCOUNT UNLOCK DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PROFILE "DEFAULT";
ALTER USER wertyq_db_usr QUOTA 100M ON USERS;
GRANT RESOURCE, CONNECT TO wertyq_db_usr;
GRANT EXECUTE ON CTX_DDL TO wertyq_db_usr;
GRANT EXECUTE ON "CTXSYS"."CTX_DDL" TO wertyq_db_usr;
GRANT UNLIMITED TABLESPACE TO wertyq_db_usr;
CREATE ROLE wertyq_usr_role;
GRANT CREATE PROCEDURE TO wertyq_usr_role;
GRANT CREATE TRIGGER TO wertyq_usr_role;
GRANT CREATE SESSION TO wertyq_usr_role;
GRANT CREATE VIEW TO wertyq_usr_role;
GRANT wertyq_usr_role TO wertyq_db_usr;

目标是创建用户和角色,然后为角色授予权限,然后将角色分配给用户,以便用户继承权限.我还应该提一下,我可以作为SYSTEM用户连接到数据库.

但是,我也在使用的第三方应用程序,它应该使用上面创建的这个用户连接到我的Oracle数据库,它的行为类似于用户没有任何权限,并且它不会在数据库中创建任何表/视图/等.因此,我直接向用户授予权限,第三方应用程序正常运行.所以我从用户中删除了权限并再次将该角色授予用户,并且第三方应用程序再次不会创建表/视图/等.

所以我想知道第三方应用程序是否有错误,或者Oracle用户是否以我认为的方式继承角色的权限?我很感激你的见解:)

谢谢!

最佳答案
你没有提到它,但这在使用PL / SQL时非常典型.

对于定义为使用定义者权限执行的命名PL / SQL块,将禁用通过角色授予的权限.

How Roles Work in PL/SQL Blocks

All roles are disabled in any named PL/SQL block (stored procedure,
function, or trigger) that executes with definer’s rights. Roles are
not used for privilege checking and you cannot set roles within a
definer’s rights procedure.

您可以在上面引用的文档中找到更多详细信息.

可能的解决方法涉及直接授予权限(如您所做)或定义PL / SQL程序单元以使用调用者的权限执行.

从12c开始的另一种可能性是,您可以将角色授予PL / SQL程序单元.因此,如果使用动态SQL创建名为p1的过程的表,则可以将上述角色授予它:

grant wertyq_usr_role to procedure p1;

选择一个适合您需求的产品.

转载注明原文:通过Oracle 12c中的角色授予用户权限的问题 - 代码日志