2017-04-25 73 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;