DB2数据库中创建存储过程期间出错

时间:2016-05-04 11:54:41

标签: sql stored-procedures db2

在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等,但问题仅在存储过程创建期间存在。 知道我做错了什么吗?

1 个答案:

答案 0 :(得分:2)

根据您的错误消息,SQLCODE -551表示用户" XYZ"没有" INSERT"表格上的特权" ABC.One_Column_table"。

由于您暗示您在作为XYZ连接时可以通过发出简单的INSERT语句插入到表中,因此您可能通过组成员资格间接拥有INSERT权限。对于存储过程,函数或触发器中的SQL语句,将忽略组权限,如this IBM technote中所述。

您有两种选择:

  1. 直接向用户ABC.One_Column_table授予XYZ所需的权限。
  2. 创建角色(使用CREATE ROLE语句),将表权限授予该角色,然后将该角色授予用户XYZ
  3. 如果您感到好奇,这种行为是由于仅在编译期间检查静态SQL语句(例如,在存储过程中)授权这一事实引起的,然后可以在没有额外授权检查的情况下执行编译的代码。操作系统在DB2数据库之外维护组,并且在编译存储过程之后组成员身份可能会发生更改,并且没有数据库安全管理员的知识。如果组权限对静态SQL有效,则允许最初未被授权运行特定语句的用户(即在编译时不是授权组的成员)仍然执行这些语句,从而产生安全风险。

    另一方面,角色由数据库安全管理员在数据库本身内维护,因此属于同一安全环境。