使用 CLI SQLDriverConnect 的隐式本地连接(无密码)失败,SQL30082N 原因 3 PASSWORD MISSING
Implicit local connection (passwordless) using CLI SQLDriverConnect fails with SQL30082N reason 3 PASSWORD MISSING
我正在使用 Db2 CLI/ODBC API 接口进行编码。 Windows10
如果我在连接字符串中提供用户名和密码 (UID / PWD) 密钥,我可以使 SQLDriverConnect 功能正常工作,并且可以连接到任何本地或远程数据库。
这部分工作正常。
例如。如果我的连接字符串类似于 "DSN=SAMPLE;UID=xxxxx;PWD=yyyyy"
,则连接正常。
但是根据 documentation,Db2 应该支持隐式本地连接(当应用程序与数据库服务器在同一主机上运行时),并且您应该能够连接到本地数据库而无需提供 user/pwd 信息。
The server code detects whether a connection is local or remote. For local connections, when authentication is SERVER, a user ID and password are not required for authentication to be successful.
在本地,使用 CLP CONNECT 命令,它也可以在不传递密码的情况下隐式工作 db2 connect to sample
。这证明服务器已正确配置。 (身份验证设置为服务器)
但是,当使用应用程序 CLI 代码尝试相同的方法时,如果我只是在连接字符串中提供 DSN(数据库名称),我会收到 SQL30082N 原因 3 密码丢失错误。我尝试了几种变体,例如:
DSN=SAMPLE;
DSN=SAMPLE;UID=;PWD=;
DSN=SAMPLE=UID=;
DSN=SAMPLE=UID='';PWD='';
DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1;
所有这些都失败并出现相同的 SQLstate。密码丢失。
我错过了什么?
--- PS ----
只是为了测试,我可以使用不同的编程接口使这项工作正常,比如 Powershell 使用 IBM.Data.Db2 .Net provider
# $dbFactory = [System.Data.Common.DbProviderFactories]::GetFactory('IBM.Data.DB2')
# $connection = $dbFactory.CreateConnection()
# $connection.ConnectionString = "Database=SAMPLE"
# $connection.Open()
# $connection
...
ConnectionString : Database=SAMPLE
Database : SAMPLE
IsOpen : True
...
DataSource : SAMPLE
UserId : Samuel
ClientUser :
ClientWorkStation : Samuel-ALW
InternalClientWorkStation : Samuel-ALW
...
我的 powershell 隐式连接在 db2 db:
中列为应用程序
# db2 list applications for db sample
Auth Id Application Appl. Application Id DB # of
Name Handle Name Agents
-------- -------------- ---------- -------------------------------------------------------------- -------- -----
SAMUEL powershell.exe 5316 *LOCAL.DB2.210103171916 SAMPLE 1
为什么使用 SQLDriverConnect 从 CLI 无法正常工作?
它对我来说工作正常(Db2-LUW v11.5.5.0)。
它在 Win10 和 Db2-LUW v11.5.4.0 上也能正常工作。
我使用了与 IBM 提供的示例程序 dbconn.c
中相同的代码(在 github 上可用,来自 Db2 知识中心,在 Db2-LUW 实例的示例目录中)。它显示了三种方法,包括 SQLDriverConnect
(这是我在本地测试的一种)。
我注意到 printf()
报告的连接字符串在工作时是什么,例如:
DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1;
所以我对您的建议是尝试构建并运行 IBM 示例程序(samples/cli/dbconn.c
- 可能需要对 files/build 进行轻微修改,因为 IBM 似乎没有在示例目录,在 github 上可能有所不同)。 IBM 提供示例脚本来构建位于同一目录树中的这些程序(bldapp
等)。
为了进行故障排除,请仔细检查您要连接的别名是如何定义的。具体检查目录和(对于 IBM 提供的驱动程序)db2dsdriver.cfg
内容,必要时手动创建后者。 SQL30082N 原因 3 将导致非本地数据库。
您还可以使用 CLI 跟踪来观察幕后发生的事情,请参阅 Db2 知识中心以了解 运行 db2trc
命令、转储其输出、格式化其二进制文件的详细信息输出为可读文本等
1、感谢@mao 的帮助。我在另一个工作站执行了另一个全新安装,它在那里工作。所以,我的原始系统出现了“错误”。
在days/hours之后,在@Mitchell Waite
的帮助下,我终于找到了问题
cli 驱动程序为此数据库提供默认用户名,但没有密码,因此出现 密码丢失 错误。
默认 UID 来自 db2cli.ini 文件,该文件具有以下内容:
[SAMPLE]
DBALIAS=SAMPLE
UID=samuel
我不记得是手动创建的,但我想这是在我玩 ODBC DSN 时出现的 windows GUI 进行一些测试..
无论如何,从这个条目中删除 UID,或者删除整个 [SAMPLE] 部分,它又开始工作了,正如预期的那样!
我正在使用 Db2 CLI/ODBC API 接口进行编码。 Windows10
如果我在连接字符串中提供用户名和密码 (UID / PWD) 密钥,我可以使 SQLDriverConnect 功能正常工作,并且可以连接到任何本地或远程数据库。 这部分工作正常。
例如。如果我的连接字符串类似于 "DSN=SAMPLE;UID=xxxxx;PWD=yyyyy"
,则连接正常。
但是根据 documentation,Db2 应该支持隐式本地连接(当应用程序与数据库服务器在同一主机上运行时),并且您应该能够连接到本地数据库而无需提供 user/pwd 信息。
The server code detects whether a connection is local or remote. For local connections, when authentication is SERVER, a user ID and password are not required for authentication to be successful.
在本地,使用 CLP CONNECT 命令,它也可以在不传递密码的情况下隐式工作 db2 connect to sample
。这证明服务器已正确配置。 (身份验证设置为服务器)
但是,当使用应用程序 CLI 代码尝试相同的方法时,如果我只是在连接字符串中提供 DSN(数据库名称),我会收到 SQL30082N 原因 3 密码丢失错误。我尝试了几种变体,例如:
DSN=SAMPLE;
DSN=SAMPLE;UID=;PWD=;
DSN=SAMPLE=UID=;
DSN=SAMPLE=UID='';PWD='';
DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1;
所有这些都失败并出现相同的 SQLstate。密码丢失。
我错过了什么?
--- PS ----
只是为了测试,我可以使用不同的编程接口使这项工作正常,比如 Powershell 使用 IBM.Data.Db2 .Net provider
# $dbFactory = [System.Data.Common.DbProviderFactories]::GetFactory('IBM.Data.DB2')
# $connection = $dbFactory.CreateConnection()
# $connection.ConnectionString = "Database=SAMPLE"
# $connection.Open()
# $connection
...
ConnectionString : Database=SAMPLE
Database : SAMPLE
IsOpen : True
...
DataSource : SAMPLE
UserId : Samuel
ClientUser :
ClientWorkStation : Samuel-ALW
InternalClientWorkStation : Samuel-ALW
...
我的 powershell 隐式连接在 db2 db:
中列为应用程序# db2 list applications for db sample
Auth Id Application Appl. Application Id DB # of
Name Handle Name Agents
-------- -------------- ---------- -------------------------------------------------------------- -------- -----
SAMUEL powershell.exe 5316 *LOCAL.DB2.210103171916 SAMPLE 1
为什么使用 SQLDriverConnect 从 CLI 无法正常工作?
它对我来说工作正常(Db2-LUW v11.5.5.0)。
它在 Win10 和 Db2-LUW v11.5.4.0 上也能正常工作。
我使用了与 IBM 提供的示例程序 dbconn.c
中相同的代码(在 github 上可用,来自 Db2 知识中心,在 Db2-LUW 实例的示例目录中)。它显示了三种方法,包括 SQLDriverConnect
(这是我在本地测试的一种)。
我注意到 printf()
报告的连接字符串在工作时是什么,例如:
DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1;
所以我对您的建议是尝试构建并运行 IBM 示例程序(samples/cli/dbconn.c
- 可能需要对 files/build 进行轻微修改,因为 IBM 似乎没有在示例目录,在 github 上可能有所不同)。 IBM 提供示例脚本来构建位于同一目录树中的这些程序(bldapp
等)。
为了进行故障排除,请仔细检查您要连接的别名是如何定义的。具体检查目录和(对于 IBM 提供的驱动程序)db2dsdriver.cfg
内容,必要时手动创建后者。 SQL30082N 原因 3 将导致非本地数据库。
您还可以使用 CLI 跟踪来观察幕后发生的事情,请参阅 Db2 知识中心以了解 运行 db2trc
命令、转储其输出、格式化其二进制文件的详细信息输出为可读文本等
1、感谢@mao 的帮助。我在另一个工作站执行了另一个全新安装,它在那里工作。所以,我的原始系统出现了“错误”。
在days/hours之后,在@Mitchell Waite
的帮助下,我终于找到了问题cli 驱动程序为此数据库提供默认用户名,但没有密码,因此出现 密码丢失 错误。
默认 UID 来自 db2cli.ini 文件,该文件具有以下内容:
[SAMPLE]
DBALIAS=SAMPLE
UID=samuel
我不记得是手动创建的,但我想这是在我玩 ODBC DSN 时出现的 windows GUI 进行一些测试..
无论如何,从这个条目中删除 UID,或者删除整个 [SAMPLE] 部分,它又开始工作了,正如预期的那样!