2017-04-25 72 views
2

我正试图解决将用户添加到SQL Server数据库的问题。我们称这个用户为Login A。登录A是一个Windows AD帐户。我不断收到以下错误。无法创建SQL Server用户

消息15063,级别16,状态1,行1
登录已经根据不同的用户名

一点背景一笔账:我原来在一个创建了这个数据库Login A机。然后,我将它恢复到另一台使用用户B登录的机器。现在,当我尝试将用户A添加到恢复的实例时,出现该错误。

从我所知道的,用户A在恢复的实例中不存在。我在sys.server_principalssys.database_principals表中看不到它。此外,如果我尝试以该用户身份登录,则会收到登录失败的消息。这个用户在哪里隐藏?

+0

检查登录 – Sami

+0

登录时可能仍然坐在服务器水平,并已失去了它的映射到数据库的登录,反之亦然......即。该登录处于其中一个级别。同时检查 – scsimon

+0

如何在任何地方看不到登录名? – Dave

回答

1

听起来像User A是孤儿。下面是一个脚本,它将检测孤立用户并创建一个drop脚本以正确删除它们。然后,您应该能够正确地重新创建User A

DECLARE @SQL nvarchar(2000) 
DECLARE @name nvarchar(128) 
DECLARE @database_id int 

SET NOCOUNT ON; 

IF NOT EXISTS 
    (SELECT name FROM tempdb.sys.tables WHERE name like '%#orphan_users%') 
BEGIN 
    CREATE TABLE #orphan_users 
     (
     database_name nvarchar(128) NOT NULL, 
     [user_name] nvarchar(128) NOT NULL, 
     drop_command_text nvarchar(200) NOT NULL 
     ) 
END 

CREATE TABLE #databases 
(
    database_id int NOT NULL 
    , database_name nvarchar(128) NOT NULL 
    , processed bit NOT NULL 
) 

INSERT 
    #databases 
    (database_id 
    , database_name 
    , processed) 
SELECT 
    database_id 
    , name 
    , 0 
FROM 
    master.sys.databases 
WHERE 
    name NOT IN 
    ('master' 
    , 'tempdb' 
    , 'msdb' 
    , 'distribution' 
    , 'model') 

WHILE (SELECT COUNT(processed) FROM #databases WHERE processed = 0) > 0 
BEGIN 
    SELECT TOP 1 
     @name = database_name, 
     @database_id = database_id 
    FROM #databases 
    WHERE processed = 0 
    ORDER BY database_id 

    SELECT @SQL = 

'USE [' + @name + ']; 
INSERT INTO #orphan_users (database_name, user_name, drop_command_text) 
SELECT 
    DB_NAME() 
    , u.name 
    , ' + '''' 
    + 'USE [' + @name + ']; ' 
    + 'DROP USER [' 
    + '''' + ' + u.name 
    + ' + '''' + '] ' 
    + '''' + ' 
FROM 
    master..syslogins l 
RIGHT JOIN 
    sysusers u 
ON l.sid = u.sid 
WHERE 
    l.sid IS NULL 
AND issqlrole <> 1 
AND isapprole <> 1 
AND (u.name <> ' + '''' + 'INFORMATION_SCHEMA' + '''' 
     + ' AND u.name <> ' + '''' + 'guest' + '''' 
     + ' AND u.name <> ' + '''' + 'dbo' + '''' 
     + ' AND u.name <> ' + '''' + 'sys' + '''' 
     + ' AND u.name <> ' + '''' + 'system_function_schema' + '''' + ')' 

    PRINT @SQL; 

    EXEC sys.sp_executesql @SQL 

    UPDATE 
     #databases 
    SET 
     processed = 1 
    WHERE 
     database_id = @database_id; 
END 

SELECT 
    database_name 
    , [user_name] 
    , drop_command_text 
FROM 
    #orphan_users 
ORDER BY 
    [database_name] 
    , [user_name]; 

DROP TABLE #databases; 
DROP TABLE #orphan_users; 

SET NOCOUNT OFF;