2016-02-28 78 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')一个结果。该结果集在其返回的一行/列中可能有NULL值,但它仍然存在,因此使用IF EXISTS时出现错误。您需要检查,IF DB_ID('AP') IS NOT NULL

接下来,你打开自己的SQL注入。您应该仔细研究它,并理解为什么您使用的动态SQL是危险的。

最后,如果将EXEC与一串动态SQL一起使用,则需要将其放在大括号中,否则SQL会认为您正在尝试调用存储过程。 EXEC函数和EXEC命令的语法略有不同。所以,你需要EXEC(@CreateUser)