db2 使用Ibm_db_dbi中的游标obj时无法执行SELECT语句

ux6nzvsh  于 10个月前  发布在  DB2
关注(0)|答案(1)|浏览(106)

我已经使用ibm_db成功地连接到一个数据库,但是当我试图使用execute方法执行一个语句时,总是得到同样的错误。下面是我的代码:

import ibm_db,ibm_db_dbi
conn=ibm_db.pconnect("DATABASE=mydb;HOSTNAME=Hostname;PORT=xxxx;AUTHENTICATION=SERVER;PROTOCOL=TCPIP;UID=usr;PWD=pwd;", "", "")
con=ibm_db_dbi.Connection(conn) 
sql="SELECT * FROM xxxxx.xxxxx"
curs=con.cursor()   
curs.execute(sql)

字符串
我得到的错误是:
编程错误:ibm_db_dbi::编程错误:SQLNumResultCols失败:[IBM][CLI Driver][AS] SQL 0551 N语句失败,因为授权ID没有执行该操作所需的授权或权限。受权识别码:“"。操作:“"。对象:“空系统ID 200”。SQL状态=42501 SQL代码=-551
如果我在IBM i Access SQL控制台上使用相同的SQL语句,那么它可以正常工作,所以我认为应该允许我执行该操作。

krcsximq

krcsximq1#

Python ib_db模块使用CLI包(因为python ibm_db是用C编写的,并使用CLI API访问Db2)。但是IBMiaccess驱动程序并不使用这些包(它主要是用java编写的)。这就是为什么你看到两个司机之间的行为有不同的原因。
要更正此问题,您需要让i管理员使用工作站上的文件执行绑定操作。这可以在您的工作站上完成,但是需要IBM i管理员的authid(或者任何具有适当授权的人),以便在IBM i上的数据库上执行绑定操作,例如具有DBADM权限的任何人)。
主文件是。。\site-packages\clidriver\bin\db2cli.lst(其中site-packages是您的python包位置,在pip show ibm_db输出中可见)。
要执行绑定操作,必须首先创建和配置db2dsdriver.cfg文件,该文件定义任何目标数据库的连接详细信息和参数,还定义与远程数据库对应的DSN(数据源名称)。参考文档(谷歌的例子)。
然后,您可以使用db2cli命令执行绑定操作,命令行类似于:
db2cli bind @db2cli.lst -dsn XXX -user YYY -passwd ZZZ -options "grant public"
其中XXX对应于您在db2driver.cfg中创建/配置的DSN,YYY是IBM-i上具有绑定授权(或DBADM权限)的authid,ZZZ是该authod的密码。请注意,您应该在该命令行中**完全限定db2cli.lst的路径名(其完整路径),或者在运行命令之前使用cd更改其目录。bind操作需要几秒钟,结果立即生效,然后CLI包将可以通过常规authid执行。

注1:如果i管理员可以访问完整的db2 CLP(命令行处理器),则可以在该环境中执行相同的绑定操作**,只要**您的工作站上的绑定文件完全相同(完全相同的版本),例如db2 connect to XXX user YYY using ZZZ,后面是db2 bind @db2cli.lst blocking all grant publicdb2 connect reset
注2:i管理员还可以使用通常使用的任何首选接口直接在i数据库上运行单个grant语句(例如,grant execute on NULLID.SYSSH200 to public)。但是,其他额外的包可能需要类似的授权,这就是使用db2cli.lst文件中指定的所有包的原因。根据您现在或以后调用ibm_db的哪些方面,可以使用其他包)。

相关问题