在SQL中,您可以设置1个具有多个值的变量来创建多个用户吗?

问题描述 投票:0回答:1

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

例如,我想要以下内容:

  1. 使用DB 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

以上是因为它给出了以下错误:

Msg 102,Level 15,State 1,Line 3

'domain \ Username2'附近的语法不正确。

Msg 137,Level 15,State 2,Line 5

必须声明标量变量“@User”。

Msg 137,Level 15,State 2,Line 6

必须声明标量变量“@User”。

Msg 137,Level 15,State 2,Line 8

必须声明标量变量“@User”。

Msg 137,Level 15,State 2,Line 9

必须声明标量变量“@cmd”。

Msg 137,Level 15,State 2,Line 9

必须声明标量变量“@ cmd2”。

Msg 137,Level 15,State 2,Line 11

必须声明标量变量“@User”。

这样的事情是可能的,因为它会让事情变得更好吗?

sql loops tsql variables
1个回答
2
投票

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

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
© www.soinside.com 2019 - 2024. All rights reserved.