如图,两个数据库db0和db1,db1创建了db0的联合体,user mapping从db1的db2inst1到db0的db2instt,DB1上同时在DB1上创建的两个昵称db2inst1.A1和db2inst1.A2
两个数据库中都有一个用户dbselect
以下都在DB1上操作
问题描述:
在确定dbselect都有DB1上两个昵称的select权限的前提下,DB1上的db2select用户执行如下查询,提示SQL0551N
$ db2 "select count(*) from db2inst1.A2"
1
-----------
SQL0551N "DBSELECT" does not have the privilege to perform operation
"unknown" on object "unknown". SQLSTATE=42501
但是查询昵称A1是可以的
db2 "select count(*) from db2inst1.A1"
1
-----------
5769
1 record(s) selected.
问题分析:
首先再次确定DB1的dbselect是否真正含有db2inst1.A2的权限,
$ db2 "select char(grantee,20) as grantee,char(TABSCHEMA,20) as schema,char(tabname,20) as tabname,selectauth from syscat.tabauth where tabname in ('A1','A2') and grantee='DBSELECT'"
GRANTEE SCHEMA TABNAME SELECTAUTH
-------------------- -------------------- -------------------- ----------
DBSELECT DB2INST1 A1 Y
DBSELECT DB2INST1 A2 Y
2 record(s) selected.
再次尝试长须db2inst2仍然提示错误.
重建该nickname后问题依旧.
此时想到db2diag.log,找到关键问题
2012-12-19-22.01.10.212596+480 I2294E826 LEVEL: Error
PID : 24368 TID : 47084828879168PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000 DB : GZF
APPHDL : 0-91 APPID: *LOCAL.db2inst1.121219135504
AUTHID : DBSELECT
EDUID : 48 EDUNAME: db2agent (GDYCGZF) 0
FUNCTION: DB2 UDB, drda wrapper, report_error_message, probe:20
DATA #1 : String, 16 bytes
ODBC native err:
DATA #2 : String with size, 4 bytes
-551
DATA #3 : String, 16 bytes
ODBC sqlstate:
DATA #4 : String with size, 6 bytes
42501.
DATA #5 : String, 16 bytes
ODBC error txt:
DATA #6 : String with size, 162 bytes
[IBM][CLI Driver][DB2/AIX64] SQL0551N "DBSELECT" does not have the privilege to perform operation "SELECT" on object "DB2INSTT.A2". SQLSTATE=42501
模式名怎么会是DB2INSTT,这里使用的用户名和模式名都是db2inst1呀?
莫非DB0的dbselect也需要A1和A2的select才行?
解决方法:
DB0用上面的SQL查询DBSELECT在两个表的权限,发现DBSELECT已经有了A2的select,而没有A1的select...
在DB0上grant select on table db2instt.A2 to user dbselect后,解决问题
分析:
这里两个库的dbselect没有做user mapping,所以db2会要求如果两个库中的dbselect都对同一对象有权限时才能select.
另外一个解决方法是创建dbselect的user mapping
添加新评论1 条评论
2013-07-06 23:45