SQL CREATE LOGON - нельзя использовать @parameter в качестве имени пользователя - PullRequest
4 голосов
/ 08 мая 2009

Я разработчик, и я отстой в SQL :) Пожалуйста, помогите мне здесь.

Я хотел бы создать свою собственную хранимую процедуру, которая создает арендатора в моей базе данных SaaS. Для этого мне нужно создать новую учетную запись SQL для арендатора, а затем добавить ее в предопределенную роль SQL.

Я уже в тупике, просто пытаюсь создать Логин. Вот что я пробовал ...

CREATE PROCEDURE [MyScheme].[Tenants_InsertTenant]
    @username nvarchar(2048),
    @password nvarchar(2048)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    CREATE LOGIN @username WITH PASSWORD = @password
END

Сообщение 102, Уровень 15, Состояние 1, Процедура Tenants_InsertTenant, Строка 16 Неверный синтаксис рядом с'@username'.

Сообщение 319, уровень 15, состояние 1, процедура Tenants_InsertTenant, строка 16 Неверный синтаксис рядом с ключевым словом «с». Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой.

Я понимаю, что это должно быть просто, но когда ваш новичок в SQL и ошибки диспетчера SQL настолько загадочны, насколько мне кажется, лучше просто обратиться за помощью:)

Спасибо, Джастин

Ответы [ 3 ]

9 голосов
/ 08 мая 2009

Видимо, CREATE LOGIN принимает только литералы. Вы можете попробовать обернуть его в exec и построить в виде строки:

EXEC('CREATE LOGIN ' + quotename(@username) + ' WITH PASSWORD = ' + quotename(@password, ''''))

edit: добавлено квотенство для защиты от SQL-инъекций

5 голосов
/ 08 мая 2009

Возможное решение:

sp_addlogin @loginame = 'test', @passwd = 'test', @defdb = 'test'
2 голосов
/ 08 мая 2009

Попробуйте это:

declare @t nvarchar(4000)
set @t = N'CREATE LOGIN ''''' + @username + ''''' WITH PASSWORD = ''''' + @password
exec sys.sp_executesql @t
...