如果用户尚不存在,我想在数据库'mydb'中创建用户'foo'.目前我的脚本如下所示:
USE [mydb]
CREATE USER [foo] FOR LOGIN [foo]
GO
Run Code Online (Sandbox Code Playgroud)
但是,如果用户已存在,则会失败并显示错误消息:
Msg 15023, Level 16, State 1, Line 2
User, group, or role 'jsrvpp' already exists in the current database.
Run Code Online (Sandbox Code Playgroud)
如何更改脚本以便仅在用户不存在时才创建用户?
谢谢!
mar*_*c_s 32
您可以查询两个系统目录sys.server_principals以检查特定数据库中的服务器登录名或sys.database_principals,以供数据库用户使用:
use myDB
GO
if not exists(select * from sys.database_principals where name = 'foo')
-- create your database user
if not exists(select * from sys.server_principals where name = 'foo')
-- you need to create a server login first
Run Code Online (Sandbox Code Playgroud)
渣
Mat*_*att 16
根据Chris的评论要求,基本上结合David的答案和marc_s的答案.
联机丛书说sp_grantdbaccess:
将在Microsoft SQL Server的未来版本中删除此功能.避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序.请改用CREATE USER.
因此,如果仅在用户尚不存在的情况下创建用户,我会执行以下操作:
/* Make sure User is created in the appropriate database. */
USE mydb
GO
/* Users are typically mapped to logins, as OP's question implies,
so make sure an appropriate login exists. */
IF NOT EXISTS(SELECT principal_id FROM sys.server_principals WHERE name = 'foo') BEGIN
/* Syntax for SQL server login. See BOL for domain logins, etc. */
CREATE LOGIN foo
WITH PASSWORD = 'sufficiently complex password'
END
/* Create the user for the specified login. */
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = 'foo') BEGIN
CREATE USER foo FOR LOGIN foo
END
Run Code Online (Sandbox Code Playgroud)
尽管被弃用,但sp_grantdbaccess确实具有能够为用户/登录名使用参数或局部变量的优势,如David的回答.我能想到的第一个替代方法是使用CREATE USER来使用动态SQL.例如:
/* Make sure User is created in the appropriate database. */
USE mydb
GO
DECLARE @NewUserName sysname;
DECLARE @NewUsersLogin sysname;
SET @NewUserName = 'foo';
SET @NewUsersLogin = 'bar';
/* Users are typically mapped to logins, as OP's question implies,
so make sure an appropriate login exists. */
IF NOT EXISTS(SELECT principal_id FROM sys.server_principals WHERE name = @NewUsersLogin) BEGIN
/* Syntax for SQL server login. See BOL for domain logins, etc. */
DECLARE @LoginSQL as varchar(500);
SET @LoginSQL = 'CREATE LOGIN '+ @NewUsersLogin +
' WITH PASSWORD = ''sufficiently complex password''';
EXEC (@LoginSQL);
END
/* Create the user for the specified login. */
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = @NewUserName) BEGIN
DECLARE @UserSQL as varchar(500);
SET @UserSQL = 'CREATE USER ' + @NewUserName + ' FOR LOGIN ' + @NewUsersLogin;
EXEC (@UserSQL);
END
Run Code Online (Sandbox Code Playgroud)
有趣的是,Books Online还说sp_grantdbaccess
实际上是调用CREATE USER
,我在测试中注意到,如果你没有明确地指定一个模式,sp_grantdbaccess
将创建一个以用户命名的名称,而CREATE USER
默认情况下将使用'dbo'.
Dav*_*vid 14
这就是我们做的......
IF NOT EXISTS (SELECT * FROM DBO.SYSUSERS WHERE NAME = @usrName )
BEGIN
PRINT 'Granting access to the current database to login ' + @usrName + '...'
-- Grant access to our database
EXEC SP_GRANTDBACCESS @usrName
END ELSE BEGIN
PRINT 'Login ' + @usrName + ' already granted access to current database.'
END
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
37042 次 |
最近记录: |