用户 U 运行的批处理删除并创建工作表 T。简化设置:
用户 U 的权限
db2 grant dataaccess on database to user U
db2 grant all on table T to user U
db2 transfer ownership of table T to user U
由于代码是从多个地方调用的,我认为最好从过程 P 中删除并创建表,以避免不同的代码为表创建不同的外观。
db2 -td@ -f "create procedure P()
LANGUAGE SQL
BEGIN
BEGIN
-- do nothing if drop table fails
DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
BEGIN
END;
execute immediate 'drop table T';
END;
execute immediate 'CREATE TABLE T (x int)';
END @"
但是,当用户 U 调用此过程时,它会失败并显示:
db2 "call P()"
SQL0551N The statement failed because the authorization ID does not have the
required authorization or privilege to perform the operation. Authorization
ID: "U". Operation: "CREATE TABLE". Object: T SQLSTATE=42501
是否可以向用户 U 授予权限(除了 dbadm 或其他核选项:),以便它可以成功执行过程 P?
那我再补充一个答案。mustaccio的评论让我意识到 U 能够删除 T,因为 U 拥有 T。但是一旦 T 被删除,U 就无法重新创建它,因为
CREATIN
在架构中没有授予 U。解决方案是创建一个模式 S,GRANT CREATIN/DROPIN ON S 给用户 U,然后将 T 的模式更改为 S。