首页 > 解决方案 > 在 SQL 中,您可以设置 1 个具有多个值的变量来创建多个用户吗?

问题描述

我想知道是否可以制作一个简单而快速的 T-SQL 脚本来编辑数据库以创建用户,这对于不同的人使用是有效的。我的例子意味着循环遍历一个变量,每次都获得不同的值。

例如,我希望以下内容:

  1. 使用数据库 DBNAME1
  2. 声明@User,有多个用户
  3. 创建要运行的 SQL 命令(即创建用户并应用其角色)
  4. 仅在用户不存在时应用它们

这是一个示例脚本,如果我要添加 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”。

这样的事情是否可能,因为它会使事情变得更好用?

标签: sqlloopstsqlvariables

解决方案


您可以使用表变量来存储用户名。

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

推荐阅读