xu5762173
作者xu5762173·2012-12-19 23:07
数据库管理员·Ess

查询nickname时,返回SQL0551N

字数 2931阅读 6327评论 1赞 0
如图,两个数据库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

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论1 条评论

snowmicesnowmice数据库管理员calabar
2013-07-06 23:45
谢谢,终于找到了错误了。
Ctrl+Enter 发表

作者其他文章

X社区推广