小编典典

使用Oracle PL / SQL存储过程授予其他用户表的权限

sql

我在执行以下操作的应用程序时遇到问题:

  • PL / SQL包“ A”包含应用程序的所有功能/过程
  • “ A”归“ USER_A”所有
  • “ A”在Oracle中创建用户帐户,并在这些用户下创建表
  • ‘A’还必须能够对用户表进行TRUNCATE / INSERT

注意-所有创建的表都位于安全性较低的表空间内,我们将其称为“ MY_TS”。尽管此程序包在每个新用户的架构中创建用户和表,但“
A”无权插入或删除这些表。(Oracle中的默认值?)

解决此问题的两种方法是:

  1. 将GRANT语句回显到sqlplus的命令行调用中,以新用户身份登录并向USER_A发出GRANT ALL ON [table],或者
  2. 创建一个单独的过程(称为“ B”),该过程由具有DBA权限的帐户创建并拥有。此proc使用“ AUTHID DEFINER”运行,并在对USER_A语句运行GRANT ALL ON [table]之前首先检查以确保该表位于’MY TS’中

我遇到了方法1的障碍。尽管我对命令行字符串进行了测试,但是在Oracle中封装命令显然不那么容易(我不建议使用命令外壳,但我更喜欢使用SQL
Server,但不建议调用该命令外壳!)。我使用的作品非常完美。

对于方法2,我编写了一个过程“ B”,该过程由“ AUTHID
DEFINER”编译指示定义,并由具有DBA权限的帐户编译。此proc通过表空间检查(边缘安全性),但是在执行GRANT语句时返回错误“
ORA-01929:没有授予GRANT的权限”,该语句是使用传递给’EXECUTE IMMEDIATE’命令的动态SQL构建的。

任何人都对使用其他方法会更好的方法有任何建议,或者对任何一种方法都可行(并与DBA一起通过)有解决方案?赋予USER_A更大的整体权限似乎并不可行。

感谢您的提示/反馈!


阅读 256

收藏
2021-04-28

共1个答案

小编典典

如果我提到在执行动态SQL(execute immediate)时不考虑通过角色获得的特权,可能会有所帮助。如果“具有DBA权利的帐户”具有某些角色的这些权利,则这些权利将不会用于您的动态授权声明;您将需要显式授予该帐户用户适当的特权。

2021-04-28