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