2016-02-28 1 views
0

Я пытаюсь создать пользовательский скрипт, который вытаскивает имена пользователей из таблицы и помещает их в переменную, но я сталкиваюсь с кучей ошибок. Вот что я получил.Динамический SQL Создайте заявление пользователя

USE AP 
GO 

IF EXISTS (SELECT DB_ID('AP')) 
     DROP TABLE NewLogins 

CREATE TABLE NewLogins 
    (LoginName VARCHAR(128)) 

INSERT INTO NewLogins 
VALUES ('BBrown'), ('CChaplin'), ('DDyer'), ('EEbbers') 

DECLARE NewLogins CURSOR 
STATIC 
FOR (SELECT LoginName, SUBSTRING(LoginName, 1, 4) FROM NewLogins) 

DECLARE @LoginName VARCHAR(128), @Password VARCHAR(128) 

OPEN NewLogins 
FETCH NEXT FROM NewLogins 
INTO @LoginName, @Password 
DECLARE @DropLogin VARCHAR(200) 
SET @DropLogin ='DROP LOGIN ' + @LoginName + '' 
WHILE(@@FETCH_STATUS = 0) 
    BEGIN 

     IF EXISTS (SELECT DB_ID('AP')) 
      EXEC @DropLogin 

     FETCH NEXT FROM NewLogins 

     Declare @sqlstmt VARCHAR(200) 
     SET @sqlstmt='CREATE LOGIN '[email protected] +' WITH PASSWORD ='''+ LOWER(@Password) +'9999''' 
     PRINT @sqlstmt 
     EXEC (@sqlstmt) 

     DECLARE @CreateUser VARCHAR(200) 
     SET @CreateUser ='CREATE USER '[email protected] +'FOR LOGIN ' + @LoginName 

     DECLARE @AddMemberToGroup VARCHAR(200) 
     SET @AddMemberToGroup ='EXEC sp_addrolemember ' + @LoginName +', ' + 'PaymentEntry' 

     IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = @LoginName) 
      BEGIN 
      EXEC @CreateUser 
      EXEC @AddMemberToGroup 
     END 
    END 
CLOSE NewLogins 
DEALLOCATE NewLogins 

По какой-то причине, я получаю ошибки, где он говорит:

CREATE LOGIN BBrown WITH PASSWORD ='bbro9999' 
Msg 15025, Level 16, State 1, Line 3 
The server principal 'BBrown' already exists. 
Msg 2812, Level 16, State 62, Line 45 
Could not find stored procedure 'CREATE USER BBrownFOR LOGIN BBrown'. 
Msg 2812, Level 16, State 62, Line 46 
Could not find stored procedure 'EXEC sp_addrolemember BBrown, PaymentEntry'. 
Msg 2812, Level 16, State 62, Line 28 
Could not find stored procedure 'DROP LOGIN BBrown'. 

ответ

3

Для начала, вы всегда будете получать от SELECT DB_ID('AP') ResultSet. Этот результат может иметь значение NULL в одной строке/столбце, которое он возвращает, но он все еще существует, поэтому с использованием IF EXISTS есть ошибка. Вы должны проверить, IF DB_ID('AP') IS NOT NULL.

Далее вы открываете себе SQL-инъекцию. Вы должны тщательно изучить его и понять, почему динамический SQL, который вы используете, опасен.

Наконец, при использовании EXEC со строкой динамического SQL вам нужно поместить его в фигурные скобки, иначе SQL считает, что вы пытаетесь вызвать хранимую процедуру. Синтаксис для функции EXEC и команды EXEC несколько отличаются. Итак, вам понадобится EXEC(@CreateUser)