用户sql登录失败

时间:2014-06-03 07:45:00

标签: sql-server sql-server-2008 query-string

我有一个查询从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的链接

1 个答案:

答案 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进行选择。

Security 1 Security2

需要重启才能使上述更改生效!

correct.png req.png shouldlook.png