Um processo em lote executado pelo usuário U descarta e cria uma mesa de trabalho T. Configuração simplificada:
direitos para o usuário 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
Como o código é chamado de vários lugares achei que seria legal largar e criar a tabela a partir de um procedimento P, para evitar que códigos diferentes criem looks diferentes para a tabela.
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 @"
No entanto, quando o usuário U chama esse procedimento, ele falha com:
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
É possível conceder direitos ao usuário U (além de dbadm ou outras opções nucleares :) para que ele possa executar o procedimento P com sucesso?
Vou adicionar uma resposta então. O comentário de mustaccio me fez perceber que U é capaz de descartar T, pois U possui T. Mas assim que T é descartado, U não pode recriá-lo, pois
CREATIN
não é concedido a U no esquema.A solução é criar um esquema S, GRANT CREATIN/DROPIN ON S para o usuário U, então mudar o esquema de T para S.