В SQL вы можете установить 1 переменную с несколькими значениями для создания нескольких пользователей? - PullRequest
0 голосов
/ 14 марта 2019

Мне интересно, можно ли сделать простой и быстрый скрипт T-SQL для редактирования БД с целью создания пользователей, который эффективен для использования разными людьми.Мой пример будет означать цикл по переменной, получая разные значения каждый раз.

Например, я хотел бы, чтобы ниже:

  1. Использовать DB DBNAME1
  2. Declare @Пользователь с несколькими пользователями
  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, Уровень 15, Состояние 1, Строка 3

Неверный синтаксис рядом с 'домен \ Имя пользователя2'.

Сообщение 137, уровень 15, состояние 2, строка 5

Необходимо объявить скалярную переменную "@User".

сообщение 137, уровень 15, состояние 2,Строка 6

Необходимо объявить скалярную переменную "@User".

Сообщение 137, Уровень 15, Состояние 2, Строка 8

Необходимо объявить скалярную переменную "@User".

Сообщение 137, Уровень 15, Состояние 2, строка 9

Необходимо объявить скалярную переменную "@cmd".

Msg 137, уровень 15, состояние 2, строка 9

Необходимо объявить скалярную переменную "@ cmd2".

Msg 137, уровень 15, состояние 2, строка 11

Должен объявить скалярную переменную "@User".

Возможно ли что-то подобное, так как с этим было бы намного приятнее работать?

1 Ответ

2 голосов
/ 14 марта 2019

Вы можете использовать табличную переменную для хранения имен пользователей.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...