Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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中特定登录名下是否存在某个用户?_Sql Server_Tsql_Security_Login - Fatal编程技术网

Sql server 如何检查SQL中特定登录名下是否存在某个用户?

Sql server 如何检查SQL中特定登录名下是否存在某个用户?,sql-server,tsql,security,login,Sql Server,Tsql,Security,Login,我正在使用以下代码创建用户: IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = 'PROD\Secure_user') BEGIN CREATE USER [PROD\Secure_user] FOR LOGIN [PROD\Secure_user] END 但我认为我的错误检查是不够的。如果我以前运行过以下代码会怎么样: CREATE USER [PROD\Secure_user] FOR LOGIN

我正在使用以下代码创建用户:

IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = 'PROD\Secure_user')
BEGIN
    CREATE USER [PROD\Secure_user] FOR LOGIN [PROD\Secure_user]
END
但我认为我的错误检查是不够的。如果我以前运行过以下代码会怎么样:

CREATE USER [PROD\Secure_user] FOR LOGIN [PROD\Something_else]

我上面的如果陈述仍然是错误的,对吗?因为它不检查用户的登录名,只检查存在一个具有该名称的登录名。所以我的问题是,如何检查特定用户的登录是否存在?

尝试向表中添加任何时间戳列,并检查最新的一列。 或者根据进行验证的用户数检查用户数

 IF NOT EXISTS (SELECT count(1) FROM sys.database_principals WHERE name = 'PROD\Secure_user')>1)
    BEGIN
        CREATE USER [PROD\Secure_user] FOR LOGIN [PROD\Secure_user]
    END

像这样的怎么样

IF NOT EXISTS (SELECT * from master.dbo.syslogins WHERE name = 'PROD\Secure_user'
           AND loginname = 'PROD\Secure_user')
BEGIN
    CREATE USER [PROD\Secure_user] FOR LOGIN [PROD\Secure_user]
END
如果用户是windows用户选择名称,请键入sys.database\u principals中的\u desc,我认为登录名和syslogins中的名称必须匹配。但应该有更了解情况的人来证实。可能的来源:

作为对以下反馈的响应,这将在sid上加入


如果数据库用户已经存在,但链接到其他sql server登录名,则此操作不起作用。我刚刚在sql 2008 R2中进行了测试。任何名称的db用户都可以链接到从Windows创建的SQL Server登录。当我在用户上查询sys.database_主体时,type_desc显示“WINDOWS_user”。可能不是大多数人所期望的……是的,小岛屿发展中国家仍然是匹配的。我认为Windows身份验证sql server登录的sid与Active Directory登录的唯一标识符相关,我认为该标识符也称为sid。至于db用户sid,在我看来有点模糊。如果数据库用户已经存在,但链接到不同的sql server登录,则修订版仍然不起作用。在某些情况下,必须执行ALTER USER语句。感谢您的帮助@DMason。我想我理解你的意思。我犹豫是否再编辑,因为它被接受了,但OP应该阅读你的评论。我也会把你的答案投上一票,好让大家也看到。
DECLARE @name varchar(100)
SET @name = 'PROD\Secure_user'

IF (
    SELECT count(*) 
    FROM master.dbo.syslogins sl
        INNER JOIN sys.database_principals dp ON sl.sid=dp.sid AND sl.name=dp.name
    WHERE sl.name=@name AND sl.loginname = @name
    ) > 0
BEGIN
    CREATE USER @name FOR LOGIN @name
END
USE [YourDatabaseName]
GO

--First, verify the "right" sql server login exists.
IF EXISTS ( SELECT * FROM master.sys.syslogins WHERE name = 'PROD\Secure_user' )
BEGIN
    --This is your original query.  Continue to use it, since it creates the
    --database user if it does not exist.
    IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = 'PROD\Secure_user')
    BEGIN
        CREATE USER [PROD\Secure_user] FOR LOGIN [PROD\Secure_user]
    END

    --You know the database user exists, because of the above statement.
    --However, if the above statement didn't create the database user,
    --it may be linked to the "wrong" sql server login.  This statement
    --will correct that in either circumstance.
    ALTER USER [PROD\Secure_user] 
    WITH LOGIN = [PROD\Secure_user]
END
ELSE
    RAISERROR('SQL Server login [PROD\Secure_user] does not exist.', 16, 1);