提示 Windows 用户提供密码

如果向 SQLDriverConnect 函数(客户端应用程序调用此函数以连接到 Vertica)提供的连接字符串或 DSN 缺少连接到数据库所需的任何必需的连接属性,Vertica Windows ODBC 驱动程序将打开一个对话框,提示用户输入缺失的信息(请参阅提示 Windows 用户提供缺少的连接属性)。一般情况下,不将用户密码视为必需的连接属性,因为 Vertica 用户帐户可能不具有密码。如果缺少密码属性,ODBC 驱动程序仍会在未提供密码的情况下尝试连接到 Vertica。

您可以使用 PromptOnNoPassword DSN 参数来强制 ODBC 驱动程序将密码视为必需的连接属性。如果不想在 DSN 条目中存储密码,则此参数很有用。保存在 DSN 条目中的密码是不安全的,因为这些密码作为明文存储在 Windows 注册表中,从而对同一个系统上的其他用户可见。

还有另外两个因素决定 ODBC 驱动程序是否显示 Vertica“连接 (Connection)”对话框。这两个因素如下所示(按优先级顺序):

  • SQLDriverConnect 函数调用的 DriverCompletion 参数。

  • DSN 或连接字符串是否包含密码。

下表显示了 PromptOnNoPassword DSN 参数、SQLDriverConnect 函数的 DriverCompletion 参数以及“DSN 或连接字符串是否包含密码”如何交互以控制是否显示 Vertica“连接 (Connection)”对话框。

以下示例代码演示了如何在 C++ 中将 PromptOnNoPassword DSN 参数和系统 DSN 一起使用:

wstring connectString = L "DSN=VerticaDSN;PromptOnNoPassword=1;";
retcode = SQLDriverConnect(
    hdbc,
    0,
    (SQLWCHAR * ) connectString.c_str(),
    connectString.length(),
    OutConnStr,
    255, &
    amp; OutConnStrLen,
    SQL_DRIVER_COMPLETE);

无密码条目与空密码

连接字符串或 DSN 中不包含密码和包含空密码是两种不同情况。仅当连接字符串或 DSN 不具有 PWD 属性(存放用户密码)时,PromptOnNoPassword DSN 参数才起作用。如果具有该属性,则即使该属性为空,PromptOnNoPassword 也不会提示 Windows ODBC 驱动程序显示 Vertica“连接 (Connection)”对话框。

如果要使用 DSN 为连接提供属性,则此差别会造成混乱。在 Windows ODBC 管理器中为 DSN 连接输入密码并保存该 DSN 连接后,Windows 会将 PWD 属性添加到注册表中的 DSN 定义。如果以后删除该密码,PWD 属性会保留在 DSN 定义中(只会将其值设置为空字符串)。即使您只是使用 ODBC 管理器对话框上的“测试 (Test)”按钮测试 DSN,并且稍后在保存之前清除了该 DSN,也会创建 PWD 属性。

设置了密码后,从 DSN 定义中移除 PWD 属性的唯一方法是使用 Windows 注册表编辑器:

  1. 单击 Windows“开始”菜单,然后单击“运行”。

  2. 在“运行”对话框中,键入 regedit,然后单击“确定”。

  3. 在“注册表编辑器 (Registry Editor)”窗口中,单击“编辑 (Edit)”>“查找 (Find)”(或按 Ctrl+F)。

  4. 在“查找”窗口中,输入要删除其 PWD 属性的 DSN 的名称,然后单击“确定”。

  5. 如果查找操作无法定位到 ODBC.INI 文件夹下的某个文件夹,请单击“编辑 (Edit)”>“查找下一个 (Find Next)”(或按 F3),直至已突出显示与 DSN 的名称匹配的文件夹为止。

  6. 选择 PWD 项,然后按 Delete。

  7. 单击“是”以确认删除该值。

该 DSN 现已不具有 PWD 属性,并且可以在与 PromptOnNoPassword=true 和 DriverConnect=SQL_DRIVER_COMPLETE 一起使用时促使连接对话框显示出来。