2016-03-04 3 views
0

Это дубликатом вопрос один здесь: How to use CREATE LOGIN sql statement?Действительно ли можно создать логин SQL с помощью Dynamic SQL?

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

USE MyGuitarShop 
IF OBJECT_ID('Admin_For_Login') IS NOT NULL 
DROP TABLE Admin_For_Login; 
GO 
SELECT FirstName, LastName INTO Admin_For_Login FROM Administrators; 

DECLARE @FirstName varchar(50), @LastName varchar(50), @NewUser varchar(100), @ExecVar varchar(1000); --variable to replace login name should be a varchar 
DECLARE Administrator_Loop_Cursor CURSOR 
DYNAMIC 
FOR 
    SELECT FirstName, LastName FROM Admin_For_Login; 
OPEN Administrator_Loop_Cursor 
FETCH NEXT FROM Administrator_Loop_Cursor INTO @FirstName, @LastName; 
--PRINT @FirstName + @LastName; 
SELECT @NewUser = @FirstName + @LastName; 
--PRINT @NewUser + ' - this is NewUser'; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
--FETCH NEXT FROM Administrator_Loop_Cursor INTO @FirstName, @LastName; 
IF (@@FETCH_STATUS = 0) 
BEGIN 
SELECT @NewUser = @FirstName + @LastName; 
PRINT @NewUser + ' - this is NewUser'; 

SET @ExecVar = 'CREATE LOGIN @NewUser WITH PASSWORD = ''temp'' MUST_CHANGE, '; 
SET @ExecVar = @ExecVar + 'DEFAULT_DATABASE = MyGuitarShop;'; 
SET @ExecVar = @ExecVar + ' CREATE USER @NewUser; '; 
SET @ExecVar = @ExecVar + 'ALTER ROLE OrderEntry ADD MEMBER @NewUser;'; 
EXEC (@ExecVar); 
FETCH NEXT FROM Administrator_Loop_Cursor INTO @FirstName, @LastName; 
END; 
IF NOT(@@FETCH_STATUS = 0) 
BREAK; 
END; 
CLOSE Administrator_Loop_Cursor; 
DEALLOCATE Administrator_Loop_Cursor; 

Спасибо!

ответ

1

изменить эту часть

SET @ExecVar = 'CREATE LOGIN ' + quotename(@NewUser) + ' WITH PASSWORD = ''temp'' MUST_CHANGE, '; 
SET @ExecVar = @ExecVar + 'DEFAULT_DATABASE = MyGuitarShop;'; 
SET @ExecVar = @ExecVar + ' CREATE USER ' + quotename(@NewUser) + '; '; 
SET @ExecVar = @ExecVar + 'ALTER ROLE OrderEntry ADD MEMBER ' + quotename(@NewUser) + ';'; 

и выполнить PRINT @ExecVar для проверки перед выполнением

+0

Спасибо, используя quotename() работал! – SammyPayne

+1

проблема не из-за котировки. Но вы не можете использовать переменную в CREATE LOGIN/USER. Вам необходимо объединить его, чтобы сформировать команду CREATE LOGIN. Использование quotename - гарантировать, что если у вас есть место в @NewUser, это не вызывает никаких проблем – Squirrel