Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 无法创建SQL Server用户_Sql Server - Fatal编程技术网

Sql server 无法创建SQL Server用户

Sql server 无法创建SQL Server用户,sql-server,Sql Server,我正在尝试解决向SQL Server数据库添加用户的问题。让我们将此用户登录名称为A。登录名A是一个Windows广告帐户。我一直得到以下错误 Msg 15063,16级,状态1,第1行 登录名已具有另一用户名下的帐户 一点背景:我最初在一台机器上用登录名创建了这个数据库。然后,我将其还原到另一台使用用户B登录的计算机上。现在,当我尝试将用户A添加到还原的实例时,我得到了该错误 据我所知,还原实例中不存在用户A。我在sys.server\u principals或sys.database\u p

我正在尝试解决向SQL Server数据库添加用户的问题。让我们将此用户登录名称为A。登录名A是一个Windows广告帐户。我一直得到以下错误

Msg 15063,16级,状态1,第1行 登录名已具有另一用户名下的帐户

一点背景:我最初在一台机器上用登录名创建了这个数据库。然后,我将其还原到另一台使用用户B登录的计算机上。现在,当我尝试将用户A添加到还原的实例时,我得到了该错误

据我所知,还原实例中不存在用户A。我在sys.server\u principals或sys.database\u principals表中都没有看到它。此外,如果我尝试以该用户的身份登录,我会收到一条登录失败消息。该用户将隐藏在哪里

听起来用户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;

检查登录名登录名可能仍位于服务器级别,并且已丢失到db登录名的映射,或者visa登录名也可能丢失到db登录名。该登录处于其中一个级别。检查两个为什么我在任何地方都看不到登录?您在服务器>安全>登录文件夹和服务器>数据库>yourdb>安全>登录下进行了检查,但没有看到该登录的旧用户名?@scsimon-是的,用户未列在那里。