I recently faced an interesting challenge. I was working to replace (rebuild) a view with updated DDL, but when executing the CREATE OR REPLACE VIEW statement, Db2 returned error code SQL0551N. This error means that the user ID doesn’t have authority to perform the operation. How could this happen? I was connected as the instance owner, and it has DBADM authority in the database. Even with the highest level of authority, I should be able to drop and/or re-create database objects… right?
Here was the error:
SQL0551N The statement failed because the authorization ID does not have the required authorization or privilege to perform the operation. Authorization ID: "LAW803". Operation: "REPLACE VIEW". Object: "ICIMSLF.EMPLOYEE_VW". SQLSTATE=42501
I had a feeling that the instance ID was not the owner of this object. To check, I executed the following SQL statement:
$ db2 "select char(owner,20) as owner, \
char(viewschema,20) as schema, \
char(viewname, 60) as viewname \
from syscat.views \
where viewname = 'EMPLOYEE_VW'"
OWNER SCHEMA VIEWNAME
-------------------- -------------------- ----------------------------------
DB2USER ICIMSLF EMPLOYEE_VW
1 record(s) selected.
From the above output, the user id “DB2USER” owns the object.
This explains why the Db2 instance ID could not replace the view. Even though it has the highest privilege at the database and instance level, it still would not be able to rebuild a view because it is owned by some other user.
For a user to be able to create and own a database object, the user id must have CREATEIN authority for the given schema. In this case, user id DB2USER should have been granted ‘CREATEIN’ in a schema. Let us check if this is true.
$ db2 "select char(grantor,20) as grantor,
char(grantee,20) as grantee,
char(SCHEMANAME,20) as schema,
CREATEINAUTH
from SYSCAT.SCHEMAAUTH
where schemaname = 'ICIMSLF'"
GRANTOR GRANTEE SCHEMA CREATEINAUTH
-------------------- -------------------- -------------------- ------------
LAW803 DB2USER ICIMSLF Y
LAW803 DB2USER1 ICIMSLF Y
2 record(s) selected.
From the above, it is clear that two users (identified by the column GRANTEE) have ability to create objects in the schema, but only DB2USER can perform the REPLACE VIEW since they own the view as shown below from a db2look of the view.
SET CURRENT SCHEMA = "DB2USER ";
SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","DB2USER";
create view ICIMSLF.EMPLOYEE_VW AS SELECT EMPLOYEE.EMPLOYEE...
Any other user would have to perform a DROP VIEW followed by a CREATE VIEW in order to perform the replace option.