3

在 Windows 7 上为 SQL-Server 创建 ODBC 数据源连接时遇到问题。

问题摘要:只能为“主”数据库创建 ODBC 数据源连接,而不能为附加的任意数据库创建。

我在网上搜索了一下,没有找到解决方案。以下是详细信息:

  1. 我在 Windows 7 64 位系统上安装了 MS SQL Server。详细信息:SQLEXPRESS 版本,版本:10.1.2531.0,内部版本:2007.100.2531.0,实例 ID:MSSQL10.SQLEXPRESS。

使用“SQL Server 配置管理器”,它说:

SQL Server(SQLEXPRESS) 正在运行
我还设置了:“登录身份:内置帐户->本地系统”。

  1. 使用“Microsoft SQL Server Management Studio”(版本 10.0.1600.22)我已连接到数据库,用户名和密码为空白。然后我创建了一个名为“Test1”的新数据库,并将创建的文件指向:“F:\Data\SQL Server\Test1.sdf”。我继续创建了几个(简单的)表,填充了几行,并成功运行了几个查询 - 全部使用“Microsoft SQL Server Management Studio”。到目前为止,一切都很好。

  2. 但是,我需要使用 ODBC 连接从外部程序连接到数据库。因此,使用“ODBC 数据源管理器”(\%sysdir%\SysWOW64\odbcad32.exe 版本 6.1.7600.16385)(64 位),我正在尝试创建数据源接口。这是我的经验:(我称dsn:“SYS_DB”):

3a。当去“系统DNS”->添加->“SQL Native Client 10.0”时;(司机);服务器:PLUTO\SQLEXPRESS;“具有集成的 Windows 身份验证”;(所有其他选项:默认),当我按下:“测试数据源”时,它说:

... ... 地址 PLUTO\SQLEXPRESS' 用于建立连接。
... 测试成功完成!
(PLUTO 是计算机名称)。

3b。问题是,我需要连接到“Test1”数据库,而不是默认的“master”数据库。

因此,在“ODBC 数据源管理器”窗口的第三个窗口中,当我去:-> 将默认数据库更改为:Test1,我得到一个窗口说:

输入的数据库无效
如果我返回一个窗口,并取消选中:“连接到 SQL Server 以获取其他配置选项的设置”,然后我检查:“附加数据库文件名”:F:\Data\SQL Server\Test1.sdf(就像我上面 2. 中提到),数据源测试失败并显示:
尝试连接
[微软][SQL Server Native Client 10.0][SQL Server]
文件“F:\Data\SQL Server\Test1.sdf”的标头不是有效的数据库文件标头。
文件大小属性不正确。
3c。尝试设置驱动程序时:“系统DNS”->添加->“SQL Server”;(而不是上面 3a. 中的“SQL Native Client 10.0”),行为是相同的:连接到默认的“master”数据库时成功,尝试连接到“Test1”数据库时失败,错误消息与在 3b 中。以上。

  1. 注意:当我去:“SQLcmd -L”时,它说:
    服务器:
    冥王星
    冥王星\SQLEXPRESS
    我在整个网络上搜索过,但没有找到解决方案。您的帮助将不胜感激。

许多 TIA - 海伦

更多信息(3-16):我去的时候:

>sqlcmd -S pluto\sqlexpress -Q "选择getdate()"
2013-03-16 10:07:04.380(1 行受影响)
因此与默认(“主”)数据库的连接工作正常。

但是当我去的时候:

>sqlcmd -S pluto\sqlexpress -d Test1 -Q "select getdate()"
Msg 4060, Level 11, State 1, Server PLUTO\SQLEXPRESS, Line 1
Cannot open database "Test1" requested by the login. The login failed.
Msg 18456, Level 14, State 1, Server PLUTO\SQLEXPRESS, Line 1
Login failed for user 'PLUTO\MyUser'.

因此,问题似乎在于该服务器上新数据库的用户权限/访问权限,即:“Test1”。

任何人都可以帮助如何检查/分配权限到 SQL Server 上的特定数据库吗?

许多 TIA

海伦

4

2 回答 2

3

您正在运行权限问题希望这会有所帮助。

sp_addlinkedsrvlogin

创建或更新 Microsoft® SQL Server™ 本地实例上的登录与链接服务器上的远程登录之间的映射。句法

sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname' [ , [ @useself = ] 'useself' ] [ , [ @locallogin = ] 'locallogin' ] [ , [ @rmtuser = ] 'rmtuser' ] [ , [ @rmtpassword = ] ' rmtpassword'] 参数

[@rmtsrvname =] 'rmtsrvname'

是登录映射应用到的链接服务器的名称。rmtsrvnamesysname,没有默认值。

[@useself =] 'useself'

确定用于连接到远程服务器的登录名。useself 是varchar(8),默认值为 TRUE。值 true 指定 SQL Server 身份验证登录使用自己的凭据连接到rmtsrvname,忽略rmtuserrmtpassword参数。false 指定rmtuserrmtpassword参数用于连接到指定locallogin的rmtsrvname。如果rmtuserrmtpassword也设置为 NULL,不使用登录名或密码连接到链接服务器。true for useself 对于 Windows NT 验证登录无效,除非 Microsoft Windows NT® 环境支持安全帐户委托并且提供程序支持 Windows 验证(在这种情况下,不再需要创建值为 true 的映射但仍然有效)。

[@locallogin =] '本地登录'

是本地服务器上的登录。localloginsysname,默认为 NULL。NULL 指定此条目适用于连接到rmtsrvname的所有本地登录。如果不为 NULL,locallogin可以是 SQL Server 登录名或 Windows NT 用户。Windows NT 用户必须已被直接授予对 SQL Server 的访问权限,或者通过其在授予访问权限的 Windows NT 组中的成员资格。

[@rmtuser =] 'rmtuser'

当 useself 为 false 时用于连接到rmtsrvname的用户名。rmtusersysname,默认值为 NULL。

[@rmtpassword =] 'rmtpassword'

是与rmtuser关联的密码。rmtpasswordsysname,默认值为 NULL。返回代码值

0 (success) or 1 (failure)

评论

当用户登录到本地服务器并执行访问链接服务器上的表的分布式查询时,本地服务器必须代表用户登录到链接服务器才能访问该表。使用sp_addlinkedsrvlogin指定本地服务器用于登录到链接服务器的登录凭据。

本地服务器上的所有登录名和链接服务器上的远程登录名之间的默认映射是通过执行sp_addlinkedserver自动创建的。默认映射表明 SQL Server 在代表登录名连接到链接服务器时使用本地登录名的用户凭据(相当于在链接服务器的 @useself 设置为 true 的情况下执行 sp_addlinkedsrvlogin)。仅使用sp_addlinkedsrvlogin更改默认映射或为特定本地登录添加新映射。要删除默认映射或任何其他映射,请使用sp_droplinkedsrvlogin

当所有这些条件都存在时,SQL Server 可以自动使用发出查询的用户的 Windows NT 安全凭据(Windows NT 用户名和密码)来连接到链接服务器,而不必使用sp_addlinkedsrvlogin来创建预定的登录映射:

  • 用户使用 Windows 身份验证模式连接到 SQL Server。
  • 安全帐户委托在客户端和发送服务器上可用。
  • 该提供程序支持 Windows 身份验证模式(例如,在 Windows NT 上运行的 SQL Server)。

在链接服务器使用通过在本地 SQL Server 上执行sp_addlinkedsrvlogin定义的映射执行身份验证后,远程数据库中各个对象的权限由链接服务器而不是本地服务器确定。

sp_addlinkedsrvlogin不能从用户定义的事务中执行。权限

只有sysadminsecurityadmin固定服务器角色的成员才能执行sp_addlinkedsrvlogin

故障排除

资源

于 2013-03-16T17:18:24.040 回答
1

事实证明,“Test1”数据库位于“compact”实例中。(在我的 OP 中看到“sdf”数据库文件扩展名可能已经注意到了)。

所以这就是 ODBC 连接看不到它的原因。(SQL Server Compact 版本没有 ODBC 管道)。

于 2013-03-17T15:17:08.653 回答