SQL Server : How to check if a windows user exists in the database but under a different user name

标签 sql sql-server sql-server-2005 tsql sql-server-2008

我正在尝试通过 SQL Server 2005/2008 中的 T-SQL 脚本创建用户。我运行以下 SQL 来检查用户是否存在,如果不存在则创建用户:

IF NOT EXISTS (SELECT * 
               FROM   sys.database_principals 
               WHERE  name = N'MyDomain\MyUser') 
  BEGIN 
      CREATE USER [MyDomain\MyUser] FOR LOGIN [MyDomain\MyUser] WITH default_schema=[dbo]; 

      SELECT 1; 
  END 
ELSE 
  BEGIN 
      SELECT 0; 
  END  

不幸的是,当 Windows 帐户 MyDomain\MyUser 已在数据库中但名称不同时,此方法不起作用。例如,如果 MyDomain\MyUser 是创建数据库的帐户,那么它将已经位于 dbo 用户下的数据库中。在这种情况下,我收到以下错误:

Msg 15063, Level 16, State 1, Line 1 The login already has an account under a different user name.

如何检查 Windows 用户 MyDomain\MyUser 是否已经是数据库中的用户,即使它使用不同的用户名?

最佳答案

使用 SID 而不是 name/user_id 对 Windows 用户与 sys.database_principals 进行测试:

select * from sys.database_principals where sid = SUSER_SID(N'MyDomain\MyUser')

由于这使用登录 ID 的 SID,因此它在数据库中映射到什么名称并不重要。

关于SQL Server : How to check if a windows user exists in the database but under a different user name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6212447/

相关文章:

sql-server - 为什么内部联接会产生索引扫描与索引查找

sql-server - 创建临时表前先检查临时表是否存在,如果存在则删除

mysql - 为什么我不断收到此错误 : ERROR 1064 (42000)?

MySql查询查找不在时间范围之间的记录

c# - Microsoft.Jet.OLEDB.4.0 转换字符

sql - PostgreSQL 在第 6 次执行同一查询后锁定

c# - 在 asp.net MVC 4 webapp 中,用户上传的文件存储在哪里?

sql-server - 将 CLR 扩展集成到 SQL Server 时如何引用 GAC 程序集

sql 检测更新触发器(sql server 2005)中修改的字段?

c# - 检索 VARCHAR(MAX)