我有一个查询从2个不同的服务器检索数据,但一旦我执行查询我收到此错误
用户' usr1'
的登录失败
我在server1中运行查询,用户名为:usr1
select userid, m.name, Cardid, m.dircode,
from [Server1].Database1.dbo.member m
JOIN [Server2].Database2.dbo.GetUserDetails p
on p.cprno = m.cardid
WHERE PerUserName='mftrame'
我已经在[Server2]上提供了usr1读取权限.Database2.dbo.GetUserDetails
我怎样才能检查是否在server1中添加了指向server1的链接
答案 0 :(得分:2)
来自http://support.microsoft.com/kb/889615:
设置SQL Serversecurity身份验证时会发生此问题 仅适用于Windows,并且满足以下条件之一:您是 尝试使用SQL Server连接到SQL Server数据库 登录。[...]
您需要在其他sql server上启用SQL-Server登录 最有可能的是,服务器目前只允许集成安全登录。
同时检查SSMS是否确实有效。
SQL-Server帐户还需要具有访问数据库的权限。
SELECT
ss.server_id
,ss.name
,ss.product
,ss.provider
,ss.data_source
,ss.is_linked
,ss.is_remote_login_enabled
,ss.is_rpc_out_enabled
,ss.is_data_access_enabled
,ss.uses_remote_collation
,ss.is_remote_proc_transaction_promotion_enabled
,ll.local_principal_id
,ll.uses_self_credential
,ll.remote_name
,sp.type_desc
,sp.default_database_name
,sp.default_language_name
FROM sys.linked_logins as ll
LEFT JOIN sys.server_principals as sp
ON sp.[principal_id] = local_principal_id
LEFT JOIN sys.servers AS ss
ON ss.server_id = ll.server_id
启用混合模式身份验证:
USE master
/* Mixed Authenication script SR 01-14-10, can update SQL authentication for instances.
works with SQL 05/08 not tested with SQL 05 instances*/
DECLARE @INSTANCEID VARCHAR(30)
DECLARE @STRVERSION VARCHAR(30)
DECLARE @SQLVERSION VARCHAR(30)
DECLARE @CMD VARCHAR(2000)
SET @SQLVERSION = (SELECT CONVERT(VARCHAR(20),(SERVERPROPERTY('productversion'))))
SET @INSTANCEID = ((SELECT CAST(SERVERPROPERTY('InstanceName') AS VARCHAR)))
IF (SELECT REPLACE(LEFT(@SQLVERSION,2),'.','')) = 10
BEGIN
SET @STRVERSION = 'MSSQL10'
END
ELSE
IF (SELECT REPLACE(LEFT(@SQLVERSION,2),'.','')) = 9
BEGIN
SET @STRVERSION = 'MSSQL'
END
IF @INSTANCEID IS NULL AND @STRVERSION = 'MSSQL'
BEGIN
SET @INSTANCEID = 1
END
ELSE
IF @INSTANCEID IS NULL AND @STRVERSION = 'MSSQL10'
BEGIN
SET @INSTANCEID = 'MSSQLSERVER'
END
SET @CMD = 'xp_regwrite ' + 'N' + '''HKEY_LOCAL_MACHINE''' + ',' + ' N' + '''Software\Microsoft\Microsoft SQL Server\'+ @STRVERSION +'.'+ @INSTANCEID + '\MSSQLServer'''+','+' N'+'''LoginMode'''+', '+'REG_DWORD'+','+ ' 2' --2 is mixed auth.
--EXEC(@CMD)
PRINT @CMD
--PRINT 'A restart of SQL is required for authentication changes to take effect'
也许一个例子确实有帮助:
访问服务器cordb2005上数据库目录cor_basic上的表t_users 使用用户ApertureWebServicesDE(在cordb2005上)和密码MY_TOP_SECRET_PASSWORD,您将使用:
EXEC master.dbo.sp_addlinkedserver
@server = N'RemoteDB'
,@srvproduct = 'OLE DB Provider for SQL'
,@provider = N'SQLNCLI'
,@datasrc = 'CORDB2005'
,@catalog = 'COR_Basic'
GO
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'RemoteDB'
,@useself = false
--,@locallogin = 'LocalIntegrationUser'
,@locallogin = NULL
,@rmtuser = N'ApertureWebServicesDE'
,@rmtpassword = N'MY_TOP_SECRET_PASSWORD'
GO
select *
from RemoteDB.COR_Basic.dbo.t_users
这当然是在CORDB2005上登录ApertureWebServicesDE的前提条件,并且ApertureWebServicesDE有足够的权限访问数据库COR_Basic并对T_Users进行选择。