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);