DB2创建视图触发SQL0551N?已获SELECT权限仍报错求解
问题场景
我拥有DB1.SCHEMA1.VIEW1的SELECT权限,尝试基于该视图创建新视图NEWSCHEMA.MYVIEW,执行的SQL语句如下:
SET CURRENT SCHEMA = SCHEMA1; CREATE VIEW NEWSCHEMA.MYVIEW AS SELECT * FROM DB1.SCHEMA1.VIEW1 WITH NO ROW MOVEMENT; SET CURRENT SCHEMA = NEWSCHEMA; COMMIT;
执行后触发DB2数据库错误,完整错误信息:
Category Line Position Timestamp Duration Message Error 3 0 01/27/2023 11:24:05 AM 0:00:00.007 - DB2 Database Error: ERROR [42501][IBM][DB2/AIX64] SQL0551N The statement failed because the authorization ID does not have the required authorization or privilege to perform the operation. Authorization ID: "NEWSCHEMA". Operation: "SELECT". Object: "SCHEMA1.VIEW1".
我已执行如下SQL查询权限信息:
SELECT GRANTEE, GRANTEETYPE, CONTROLAUTH, SELECTAUTH FROM SYSCAT.TABAUTH WHERE (TABSCHEMA, TABNAME) = ('SCHEMA1', 'VIEW1') AND GRANTEETYPE IN ('U', 'R')
查询结果显示我对SCHEMA1.VIEW1拥有SELECT权限,但创建视图时仍触发上述错误。
错误原因
这个问题的核心是DB2创建视图时,会以视图的所有者(这里是NEWSCHEMA)的权限来验证对底层对象的访问权限,而不是执行CREATE VIEW语句的用户权限。
你当前拥有SCHEMA1.VIEW1的SELECT权限,但NEWSCHEMA这个授权ID并没有被授予该视图的SELECT权限,所以当视图创建后,NEWSCHEMA作为所有者无法访问底层视图,直接触发权限错误。
解决方案
有两种可行的解决方式:
- 直接给
NEWSCHEMA授予SCHEMA1.VIEW1的SELECT权限:GRANT SELECT ON DB1.SCHEMA1.VIEW1 TO NEWSCHEMA; - 创建视图时指定
DEFINER为拥有SCHEMA1.VIEW1权限的当前用户,这样视图会使用定义者的权限访问底层对象:CREATE VIEW NEWSCHEMA.MYVIEW DEFINER = CURRENT_USER AS SELECT * FROM DB1.SCHEMA1.VIEW1 WITH NO ROW MOVEMENT;
内容的提问来源于stack exchange,提问作者SamR

