sql - 在 SQL 中,您可以设置 1 个具有多个值的变量来创建多个用户吗?
问题描述
我想知道是否可以制作一个简单而快速的 T-SQL 脚本来编辑数据库以创建用户,这对于不同的人使用是有效的。我的例子意味着循环遍历一个变量,每次都获得不同的值。
例如,我希望以下内容:
- 使用数据库 DBNAME1
- 声明@User,有多个用户
- 创建要运行的 SQL 命令(即创建用户并应用其角色)
- 仅在用户不存在时应用它们
这是一个示例脚本,如果我要添加 1 个用户,但我想使用这个简化版本或类似版本添加多个用户,所以人们只需要在 1 个区域中添加名称列表?
USE DBNAME1
GO
Declare @User NVARCHAR (30) = 'Domain\Username1', 'Domain\Username2', 'Domain\Username3' etc.
Declare @CMD NVARCHAR (90) = 'CREATE USER "' + @User +'" FOR LOGIN "' + @User + '"'
Declare @CMD2 NVARCHAR (90) ='ALTER ROLE [db_owner] ADD MEMBER [' + @User + ']'
if not exists(select name from sys.database_principals where name = @User)
Begin exec(@cmd) exec(@cmd2) End
ELSE
Begin Print '['+ @User +'] Exists' END
上面给出了以下错误:
消息 102,第 15 级,状态 1,第 3 行
'domain\Username2' 附近的语法不正确。
消息 137,第 15 级,状态 2,第 5 行
必须声明标量变量“@User”。
消息 137,第 15 级,状态 2,第 6 行
必须声明标量变量“@User”。
消息 137,第 15 级,状态 2,第 8 行
必须声明标量变量“@User”。
消息 137,第 15 级,状态 2,第 9 行
必须声明标量变量“@cmd”。
消息 137,第 15 级,状态 2,第 9 行
必须声明标量变量“@cmd2”。
消息 137,第 15 级,状态 2,第 11 行
必须声明标量变量“@User”。
这样的事情是否可能,因为它会使事情变得更好用?
解决方案
您可以使用表变量来存储用户名。
DECLARE @Users TABLE(Username VARCHAR(64))
INSERT INTO @Users(Username) VALUES('Domain\Username1')
INSERT INTO @Users(Username) VALUES('Domain\Username2')
DECLARE @Username AS VARCHAR(64)
DECLARE C_Users CURSOR FOR
SELECT Username FROM @Users
OPEN C_Users
FETCH NEXT FROM C_Users INTO @Username
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS(SELECT name FROM sys.database_principals WHERE name = @Username)
BEGIN
EXEC('CREATE USER [' + @Username + '] FOR LOGIN [' + @Username + ']')
EXEC('ALTER ROLE [db_owner] ADD MEMBER [' + @Username + ']')
PRINT '['+ @Username +'] created'
END
ELSE
BEGIN
PRINT '['+ @Username +'] already exists'
END
FETCH NEXT FROM C_Users INTO @Username
END
CLOSE C_Users
DEALLOCATE C_Users
推荐阅读
- php - 使用 BinaryFileResponse 的文件下载工作了一段时间,然后失败
- javascript - Firebase snapshot.forEach(async () => {}) 无法正常工作
- javascript - 谷歌地图标记多选问题
- matlab - 在 Matlab 中发生 fmincon 错误,但没有详细信息
- sql - 如何在 ms ACCESS 中选择与满足条件相关的所有行
- c# - 绑定到字符串属性的表单产生了不需要的验证错误消息:值 '' 无效
- python - 同时对 3 个列表进行数学运算
- django - 我如何将更新的请求从 1 个 api 发送到另一个 api
- packagist - 为什么我安装我的包时,packagist 没有看到/使用我的最新版本?
- sql - 如何在没有固定长度的字段值子字符串上连接表?