2013-02-04 22 views
0

我用下面的,如果它不存在于数据库中创建用户:创建数据库用户有条件语法错误

use DBExample 
GO 

IF NOT EXISTS (SELECT * from sys.database_role_members WHERE USER_NAME(member_principal_id) = 'user1') 
BEGIN 
CREATE USER [user1] WITH PASSWORD = 'abc') 
END 

EXEC sp_addrolemember 'role1', 'user1' 
GO 

DBExample已经拥有USER1,所以当我尝试运行脚本,SQL Server Management Studio抱怨'user1'附近有'错误的语法。 (在创建用户行中)

我错过了什么使其工作?

回答

0

我用这里找到的答案:https://stackoverflow.com/a/6159882来利用变量来替换用户名,以避开SSMS抱怨的'数据库中已经存在名为xxx的登录名/用户'错误。该代码看起来是这样结尾:

USE DBExample 
GO 

DECLARE @userName varchar(100) 

SET @userName = 'user1' 

IF NOT EXISTS (SELECT * from sys.server_principals WHERE name = @userName) 
BEGIN 
DECLARE @LoginSQL varchar(200); 
SET @LoginSQL = 'CREATE LOGIN ' + @userName + ' WITH PASSWORD = abc'; 
EXEC (@LoginSQL); 
END 

IF NOT EXISTS (SELECT * from sys.database_principals WHERE name = @userName) 
BEGIN 
DECLARE @UserSQL varchar(200); 
SET @UserSQL = 'CREATE USER ' + @userName + ' FOR LOGIN ' + @userName; 
EXEC (@UserSQL); 
END 

IF NOT EXISTS (SELECT * from sys.database_role_members WHERE USER_NAME(member_principal_id) = @userName) 
BEGIN 
EXEC sp_addrolemember 'role1', @userName 
END 

GO 
2

我认为你很困惑LoginsUsers - 在SQL Server 2008R2中,至少,你不能没有其他的。我建议快速浏览一下Books Online的这些概念。

你可能寻找类似:

IF NOT EXISTS (SELECT * from sys.server_principals WHERE name = 'user1') 
BEGIN 
CREATE LOGIN [user1] WITH PASSWORD = 'abc'; 
END 
GO 

USE DBExample 
GO 

IF NOT EXISTS 
(
    SELECT * from sys.database_principals dp 
    INNER JOIN sys.server_principals sp on dp.sid = sp.sid 
    WHERE dp.name = 'user1' or sp.name = 'user1' 
) 
BEGIN 
CREATE USER [user1] FOR LOGIN [user1] 
END 
GO 

IF NOT EXISTS (SELECT * from sys.database_role_members WHERE USER_NAME(member_principal_id) = 'user1') 
BEGIN 
EXEC sp_addrolemember 'role1', 'user1' 
END 

GO 

这将创建一个Login如果它不存在,进入到数据库,然后创建一个User如果它不存在,那么相关联的UserRole

+0

我得到一个错误说“已经有登入数据库名为‘user1的’ – confusedKid

+0

好吧,我怀疑已经有映射到数据库用户* USER1 *。我已经更新了代码来处理这种情况。 –