无法查询架构上的某些对象

时间:2013-10-09 18:46:49

标签: db2

我可以访问不同数据库中的某些模式,并且作为一些迁移工作的一部分,我正在比较2个模式。 我使用Syscat来比较2架构。但是在其中一个模式中,我收到错误说

  

“用户没有”

选择权限

我想知道,我怎样才能看到在特定模式中设置了什么和所有访问权限(基本上所有具有访问权限的用户和gievn模式的访问类型)。数据库是db2。 请注意,我没有使用任何工具,如架构爬虫等。相反,我正在编写一个JDBC应用程序,它使用Syscat来查询详细信息,如select * from syscat.tables where tabSchema = <schemaName>

使用工具等在获得批准,理由等方面是一个漫长的过程(我个人认为JDBC程序应该从分析开始是好的。)

2 个答案:

答案 0 :(得分:0)

在模式上授予的DB2权限中,不会为属于该模式的对象提供任何权限(除非您自己创建了这些对象)。您必须被授予显式对象权限或某些数据库级权限,例如DATAACCESS。

实际的DB2错误消息应包含生成错误的对象的名称。尝试打印SQLException对象的String表示。

答案 1 :(得分:0)

架构是一组逻辑对象。这些对象可以是视图,表,索引,序列,函数,sotred过程等。这些对象中的每一个都具有不同的权限集:表具有select,insert,delete等;存储过程具有执行权和其他功能;这意味着每个对象都有不同类型的权限,并且您无法获得“给定模式的所有权限”,您必须提供对象类型。

例如,为了获得给定模式的表的权限,您可以执行

db2 "
select substr(GRANTEE,1,16),GRANTEETYPE,substr(tabschema || '.' || tabname,1,64),
CONTROLAUTH, ALTERAUTH, DELETEAUTH, INDEXAUTH, INSERTAUTH, REFAUTH, SELECTAUTH, UPDATEAUTH 
from syscat.TABAUTH 
where tabschema like 'MYSCHEMA%'"

syscat架构中包含该类对象特权的表的每种对象。你只需要查询表格。

以类似的方式,您可以创建适当的句子,以授予或撤销对象的权限

select 'grant select on ' || trim(tabschema) || '.' || trim(tabname) ' to user johndoe'
from syscat.tables
where tabschema like 'MYSCHE%'

最后,db2上不仅有权限(授权),还有数据库级权限,其中一些权限对所有对象都有权限。