我在 DB2 数据库(10.5 版本)中创建存储过程时遇到了架构问题。 我的用户名是 XYZ,但我必须为模式 ABC 创建一个存储过程。 当我尝试执行创建过程 sql 时,我收到类似于架构相关的错误消息
Create procedure ABC.customInsert(
IN temp INTEGER
)
BEGIN
INSERT INTO ABC.One_Column_table VALUES ( temp );
END
错误消息:
Error:DB2 SQL error:SQLCODE:-551, SQLSTATE: 42501, SQLERRMC:XYZ;INSERT;ABC.One_Column_table
我当前的模式之前显示的是 XYZ。 (从 sysibm.sysdummy1 选择 current_Schema 的结果)。 我已经把它改成ABC了。 (使用 SET CURRENT SCHEMA ABC)。但还是同样的问题。
我能够在 ABC 模式中插入、选择、创建 UDT 等,但问题仅在存储过程创建期间存在。 知道我做错了什么吗?
最佳答案
根据您的错误消息,SQLCODE -551 表示用户“XYZ”对表“ABC.One_Column_table”没有“INSERT”权限。
由于您暗示,当作为 XYZ 连接时,可以通过发出简单的 INSERT
语句来插入到表中,因此您有可能通过组成员身份间接拥有 INSERT 权限。存储过程、函数或触发器中的 SQL 语句会忽略组权限,如 this IBM technote 中所述。 .
您有两个选择:
- 直接向用户
XYZ
授予ABC.One_Column_table
所需的权限。 - 创建一个角色(使用
CREATE ROLE
语句),向该角色授予表权限,然后将该角色授予用户XYZ
。
如果您好奇,这种行为是由于静态 SQL 语句(例如在存储过程中)仅在编译期间检查授权而导致的,然后可以执行编译后的代码,而无需额外的授权检查。组是由操作系统在 DB2 数据库外部维护的,并且在编译存储过程之后组成员身份可能会在数据库安全管理员不知情的情况下发生更改。如果组权限对静态 SQL 有效,它将允许最初未被授权运行特定语句的用户(即在编译时不是授权组的成员)仍然执行这些语句,从而产生安全风险。
另一方面,角色由数据库安全管理员在数据库本身内维护,因此是同一安全环境的一部分。关于sql - 在 DB2 数据库中创建存储过程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027075/