让我在这里快速猜测一下。您遇到的问题是对象名称区分大小写。快速解决方法是将对象名称括在双引号中,就像这样。
GRANT EXECUTE ON SYS."/1005bd30_LnkdConstant" TO mynewpublicrole;
您表明您“无法将 [EXECUTE ON] SYS./1005bd30_LnkdConstant”授予角色。
我认为这意味着当您运行 GRANT 语句时,Oracle 很可能引发了异常,
ORA-00903: invalid table name
将 objectname 括在双引号中(如示例中所示)应该可以解决该问题。
无法回答您的新角色是否需要对这些对象具有 EXECUTE 权限的问题。好吧,这个角色不一定需要它们。问题是用户是否需要它们(无论是直接授予,还是通过角色间接授予)。这可以通过彻底的测试来确定。
其他一些评论。
如果您打算创建一个新角色并将该角色授予所有用户,我认为安全性不会改变或改进。所以,我会假设情况并非如此。
看来您正在尝试应用“最小特权”原则。我为这种努力鼓掌。
我看到应用程序开发人员遵循的最常见模式之一是让应用程序作为模式对象的所有者连接到数据库。这意味着应用程序具有它可能不需要的各种权限,例如 DROP TABLE、ALTER PROCEDURE 等。
我们使用的模式是拥有一个拥有模式对象的“OWNER”用户,以及一个拥有对“OWNER”对象和“OWNER”对象的同义词所需的特定权限的单独的“APP”用户。(同义词允许引用 OWNER.object 而不用 OWNER 限定。)几乎不用说,我们不授予 PUBLIC 权限,而是在需要时授予角色。
我之所以提到这一点,是因为它是我们用来实现“最小特权”原则的一种模式。
对于其他安全问题,我建议您查看“Oracle 安全检查表”白皮书:
http://www.oracle.com/technology/deploy/security/database-security/pdf/twp_security_checklist_database.pdf
您在执行 GRANT 语句时可能遇到的其他一些可能的异常:
ORA-01031: insufficient privileges
或者
ORA-04042: procedure, function, package, or package body does not exist.
在任何一种情况下,请确保以 SYS (SYSDBA) 身份连接到数据库以授予权限。我们几乎总是以对象所有者的身份授予权限,而不是让其他用户作为 GRANTEE。我几乎从不在对象权限上使用“WITH GRANT OPTION”。这是一个更简单的模型,并且避免了依赖树的任何潜在问题。