使用Oracle PL/SQL存储过程授予另一个用户表的权限。

3
我遇到了一个应用程序问题,它执行以下操作:
- PL/SQL包“A”包含应用程序的所有函数/过程 - “A”归属于“USER_A” - “A”在Oracle中创建用户账户,并在这些用户下创建表 - “A”还必须能够截断/插入到用户的表中
注意 - 所有创建的表都在低安全性表空间内,我们称之为“MY_TS”。虽然此包在每个新用户模式下创建用户和表,但'A'没有权限向这些表插入或截断(在Oracle中默认情况下)。
我正在尝试解决的两种方法是:
1.将GRANT语句回显到sqlplus调用的命令行中,以登录为新用户并发出GRANT ALL ON [table] to USER_A的命令;或者 2.创建一个单独的过程(称之为'B'),由具有DBA权限的账户创建和拥有。该过程使用“AUTHID DEFINER”运行,并首先检查表是否在'MY TS'中,然后运行GRANT ALL ON [table] to USER_A语句。
我在第一种方法中遇到了障碍。显然,在Oracle中不容易外壳出一个命令(我更多地接触SQL Server,其中调用命令外壳不被建议,但如果您愿意,这很容易!),尽管我使用的命令行字符串测试完美。
对于第二种方法,我编写了一个过程'B',该过程使用“AUTHID DEFINER”指示符定义,并由具有DBA权限的帐户编译。此过程通过表空间检查(瘸腿安全性),但在执行使用动态SQL传递到“EXECUTE IMMEDIATE”命令中的GRANT语句时返回错误“ORA-01929:没有授予权限”。
是否有人有任何更好的方法或解决方案,可以使任一方法起作用(并通过DBA)?给USER_A更大的权利听起来不像是一个选项。
感谢任何提示/反馈!

http://docs.oracle.com/cd/B28359_01/network.111/b28531/authorization.htm#autoId17 - GriffeyDog
1个回答

1
也许提一下角色获取的权限在执行动态SQL(execute immediate)时不会被考虑会有所帮助。如果“具有DBA权限的账号”是通过某些角色获得这些权限的,那么这些权限不会用于您的动态授权语句;您需要显式地向该账号用户授予适当的权限。

Mustaccio - 非常感谢您的回复。结果证明,DBA账户通过像您建议的角色拥有了这些特权。DBA必须使用以下命令向该帐户授予特定权限:GRANT GRANT ANY OBJECT PRIVILEGE TO [dba level account]。这很有效!非常感谢您的帮助。 - OracleDevInToronto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接