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' 付近の構文が正しくありません」というメッセージが表示されます。(ユーザーの作成行で)

この作業を行うために何が欠けていますか?

4

2 に答える 2

2

Logins混乱していると思いますUsers-少なくとも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

于 2013-02-04T17:32:38.590 に答える
0

私はここにある答えを使用しました: https://stackoverflow.com/a/6159882変数を使用してユーザー名を置き換え、「データベースに xxx という名前のログイン/ユーザーが既に存在します」というエラーを回避しました SSMS について不平を言っていました. コードは最後に次のようになります。

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
于 2013-02-04T18:01:49.430 に答える