2016-02-28 82 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)