簡體   English   中英

使用 CLI SQLDriverConnect 的隱式本地連接(無密碼)失敗並出現 SQL30082N 原因 3 PASSWORD MISSING

[英]Implicit local connection (passwordless) using CLI SQLDriverConnect fails with SQL30082N reason 3 PASSWORD MISSING

我正在使用 Db2 CLI/ODBC API 接口進行編碼。 Windows 10

如果我在連接字符串中提供用戶名和密碼(UID / PWD)密鑰,我可以使SQLDriverConnect function 正常工作,並且可以連接到任何本地或遠程數據庫。 這部分工作正常。

前任。 如果我的連接字符串類似於"DSN=SAMPLE;UID=xxxxx;PWD=yyyyy" ,則連接工作正常。

但是根據文檔,Db2 應該支持隱式本地連接(當應用程序與數據庫服務器在同一主機上運行時),並且您應該能夠在不提供用戶/密碼信息的情況下連接到本地數據庫。

服務器代碼檢測連接是本地的還是遠程的。 對於本地連接,當驗證是 SERVER 時,驗證成功不需要用戶 ID 和密碼。

在本地,使用 CLP CONNECT 命令,它也可以隱式地工作db2 connect to sample而不傳遞密碼。 這證明服務器配置正確。 (身份驗證設置為 SERVER)

但是,當使用應用程序 CLI 代碼嘗試相同的方法時,如果我只在連接字符串中提供 DSN(數據庫名稱),我會收到 SQL30082N 原因 3 PASSWORD MISSING 錯誤。 我嘗試了幾種變體,例如:

DSN=SAMPLE;
DSN=SAMPLE;UID=;PWD=;
DSN=SAMPLE=UID=;
DSN=SAMPLE=UID='';PWD='';
DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1;

它們都以相同的 SQL 狀態失敗。 密碼丟失。

我錯過了什么?

--- PS ----

只是為了測試,我可以使用不同的編程接口使這項工作正常,例如使用 IBM.Data.Db2.Net 提供程序的 Powershell

# $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

為什么使用SQLDriverConnectCLI中不起作用?

它對我來說可以正常工作(Db2-LUW v11.5.5.0)。

它也可以在帶有 Db2-LUW v11.5.4.0 的 Win10 上正常工作。

我使用了與 IBM 提供的示例程序dbconn.c中相同的代碼(在 github 上可用,來自 Db2-知識中心的示例目錄) 它顯示了三種方法,包括SQLDriverConnect (這是我在本地測試的一種)。

我注意到printf()報告的連接字符串何時起作用,例如: DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1; DSN=sample; UID=; PWD=; AUTOCOMMIT=0; CONNECTTYPE=1;

因此,我對您的建議是嘗試構建並運行 IBM 示例程序( samples/cli/dbconn.c - 可能需要對文件/構建進行輕微修改,因為 IBM 似乎不會在示例目錄中保持其示例代碼為最新,也許github上的不同)。 IBM 提供示例腳本來構建位於同一目錄樹中的這些程序( bldapp等)。

要進行故障排除,請仔細檢查您要連接的別名是如何定義的。 專門檢查目錄和(對於 IBM 提供的驅動程序) db2dsdriver.cfg內容,必要時手動創建后者。 SQL30082N 原因 3 將導致非本地數據庫。

您還可以使用 CLI 跟蹤來觀察幕后發生的事情,請參閱 Db2 知識中心了解運行db2trc命令的詳細信息,轉儲其 output,將其二進制 Z78E6221F6393D135DZ681DB33 格式化為可讀文本等。

第一,感謝@mao 的幫助。 我在另一個工作站上執行了另一個全新安裝,它在那里工作。 因此,我的原始系統出現了“錯誤”。

幾天/幾小時后,我終於在@Mitchell Waite 的幫助下找到了問題

cli 驅動程序為此數據庫提供了默認用戶名,但沒有密碼,因此出現PASSWORD MISSING錯誤。

默認 UID 來自具有以下內容的db2cli.ini文件:

[SAMPLE]
DBALIAS=SAMPLE
UID=samuel

我不記得手動創建它,但我想這是在我玩 ODBC DSN windows GUI 進行一些測試時到達那里的。

不管怎樣,從這個條目中刪除UID ,或者刪除整個 [SAMPLE] 部分,它再次開始工作,正如預期的那樣!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM