我正在使用Windows 7上的ODBC从Power Builder 10.5连接到PostgreSQL数据库。我注意到PB在表名前面加上了表所有者,例如,如果我以“用户”的身份连接到数据库,它会将查询格式设置为“SELECT x,y,z FROM user.tablename”。
这在Sybase中是有意义的,但在postgres中不能正确工作,因为模式和用户是分开的。
我通过创建一个与用户同名的postgres模式进行了测试,然后将表放在模式中。因此,当PB使用“username.tablename”时,postgres将其解释为“schemaname.tablename”,并且这起作用了。但这只是一个测试,不是一个可用的解决方案。
它在文档中说,如果表所有者与当前用户相同,PB将不会前置所有者,但如果他们不匹配,它会。但在我的测试程序中,我看到的是相反的:如果UID与所有者名称相同,则它会前置,如果它们不匹配,则不会前置。
下面是我的连接代码:
sqlca.DBMS = "ODBC"
sqlca.userid = "pblearn"
sqlca.dbpass = "pblearn"
string ls_DSN = "PBLEARN"
string ls_connect = "ConnectString='"
ls_connect += "DSN=" + ls_DSN + ";"
ls_connect += "UID=" + sqlca.userid + ";"
ls_connect += "PWD=" + sqlca.dbpass + "'"
sqlca.dbparm = ls_connect + ", SQLQualifiers=0"
connect;
我的模式是pblearn和public(默认)。以及两个用户“pblearn”和“pblearn2”。如果我使用pblearn连接,prepend发生,我看到pblearn(表的所有者)模式中的表,如果我使用pblearn2,用户名没有prepend,我看到公共模式中的表。
我怎样才能让PB不前置用户名,或者前置一个一致的模式名而不管用户是谁?
谢谢
1条答案
按热度按时间guicsvcw1#
锁定,本次有disputes about this answer’s content正在解析。它目前不接受新的交互。
在安装使用的
PBODB105.INI
的数据库部分中,添加以下属性:来自文档:
;PBTableOwner ='NO' -不限定表名,默认值为'YES'
编辑:
如果某个特定连接不存在任何节,则Powerbuilder将作为ODBC兼容客户端运行,并且可能可用的扩展将无法使用。条目的搜索算法为:
章节标题
*DataSource_Name(默认情况下,ini文件中没有任何名称,但如果需要覆盖DBMS_Driver或DBMS_Name的更常规设置,则可以将其放入数据源特定部分
*DBMS_Name Driver_Name(Driver_Name去掉了.dll扩展名)
*DBMS_Name(SQLGetInfo调用返回的DBMS名称)
因此,为Postgres安装添加节的最简单方法是使用当前数据源名称命名节