2012-04-12 81 views
1

我在sql serevr 2012中有一個用戶表,並且希望使用來自用戶表上插入觸發器的插入值創建相應的數據庫登錄用戶。SQL Server使用觸發器中插入的值創建登錄

一切似乎工作,只是我無法正常inserted表 使用的參考價值確定,雖然我已經測試值,以確保它的存在

是有可能的是,創建登錄過程不能接受變量

ALTER TRIGGER [dbo].[addsyslogin] 
    ON [dbo].[Users] 
    FOR INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET QUOTED_IDENTIFIER OFF; 

    Declare @u varchar(10); 
    SELECT @u=i.userid from inserted i; 


    print @u; 

CREATE LOGIN [@u] WITH PASSWORD='water123GH', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON 


END 

我已經研究過quoted_identifiers,但我仍然有這個問題。

會發生什麼情況是數據庫用戶實際上是使用userid = @ u而不是@u中的值創建的。

感謝您的筆記和反饋

+2

觸發器都要上交le多行 – 2012-04-12 09:55:58

+0

就像一個註釋 - 如果你插入2個用戶,觸發器將只觸發一次,但插入的表將包含2行。你的代碼不期待這個。 – Andrew 2012-04-12 09:56:34

+1

順便說一句,你不能在CREATE LOGIN語句中使用這樣的參數... – 2012-04-12 09:58:43

回答

0

試試這個:

SET @SQL = 'CREATE LOGIN ' + @u+ ' WITH PASSWORD = ''water123GH'', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON'; 
EXECUTE(@SQL); 
+1

動態SQL觸發器!你很想去TSQL地獄! – 2012-04-12 09:59:12

+1

aww,但userid是用一個sql參數值「」drop database water「創建的:p – 2012-04-12 10:01:29

+0

有點同意但是這會解決他的問題。我絕不會在觸發器上創建登錄,但我們不知道他的現實。也許由於一些令人毛骨悚然的原因,他唯一的可能 – Diego 2012-04-12 10:01:36

0

這是做一件奇怪的事,但你需要......

  • 允許多行
  • 升級權限
  • 使用動態SQL

其他說明:

  • 我建議你需要掌握一個單獨的存儲過程,你的觸發器調用處理與升級
  • 如果你不需要升級,那麼你的特權過高

粗糙代碼:

ALTER TRIGGER [dbo].[addsyslogin] ON [dbo].[Users] FOR INSERT 
WITH EXECUTE AS --soemthing 
AS 
SET NOCOUNT ON; 

Declare @u varchar(10), @uid int; 

SELECT TOP 1 @uid = i.userid, @u = i.userid 
FROM inserted i 
ORDER BY i.userid; 

WHILE @u IS NOT NULL 
BEGIN 
    SET @SQL = 'CREATE LOGIN ' + @u+ ' WITH PASSWORD = ''water123GH'', DEFAULT_DATABASE=[waterdb], DEFAULT_LANGUAGE=[British], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON'; 

    EXECUTE(@SQL); 

    SET @u = NULL; 

    SELECT TOP 1 @uid = i.userid, @u = i.userid 
    FROM inserted i 
    WHERE i.userid > @uid 
    ORDER BY i.userid; 

END 

GO 
+0

非常感謝,非常感謝 – user1328709 2012-04-12 10:07:07