sql - 在 DB2 数据库中创建存储过程时出错

标签 sql stored-procedures db2

我在 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 中所述。 .

您有两个选择:

  1. 直接向用户 XYZ 授予 ABC.One_Column_table 所需的权限。
  2. 创建一个角色(使用CREATE ROLE语句),向该角色授予表权限,然后将该角色授予用户XYZ

如果您好奇,这种行为是由于静态 SQL 语句(例如在存储过程中)仅在编译期间检查授权而导致的,然后可以执行编译后的代码,而无需额外的授权检查。组是由操作系统在 DB2 数据库外部维护的,并且在编译存储过程之后组成员身份可能会在数据库安全管理员不知情的情况下发生更改。如果组权限对静态 SQL 有效,它将允许最初未被授权运行特定语句的用户(即在编译时不是授权组的成员)仍然执行这些语句,从而产生安全风险。

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

关于sql - 在 DB2 数据库中创建存储过程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027075/

相关文章:

php - 如何选择相对值最高的列?

MySQL:如果存储过程中的选定字段具有 NULL 值,我想返回 N/A 作为值

sql - 在转换之前验证日期,也就是。 ISDATE() 等效

mysql - 最新 MySQL 中的存储过程与普通 SQL 查询?

java - 无法识别 JDBC 列

java - 无法将字符集 65535 中的字节转换为日语 (5035)

php - 在 PHP 循环中使用两个或多个 SQL 查询语句

android - 将 UNION ALL 与其他表一起使用时保留一个表中的所有记录

MySQL Left Join(我认为)困难

java - 如何使用过程将值插入数据库