2012-02-22 52 views
0

我在學生表中有一個觸發器,當我刪除一個學生時刪除其他表中的相關記錄。我想通過調用觸發器中的aspnet_delete_user存儲過程來刪除學生的成員數據。但是如果我刪除一個學生,這個工作就可以瞭如果我在一個查詢中移除了多個學生,那麼它不起作用。調用aspnet_delete_user SP觸發器

如何將此SP調用爲多行操作觸發器?

+0

不'aspnet_delete_user'採取什麼參數?哪個參數映射到'inserted'僞表中的哪個列? – 2012-02-22 22:01:32

回答

2

你必須使用遊標或者建立一個動態的SQL字符串(它沒有這麼說就使用遊標)。或者,您可以複製存儲過程中的邏輯並查看是否可以將其定製爲基於集合的 - 我沒有看過程序,所以我不確定這是否可行,實用或甚至可能,但這是我在將光標或動態SQL添加到觸發器之前要做的第一件事。

對於一個光標,這樣的事情(我猜你傳遞一個GUID或東西的過程,但我不知道):

CREATE TRIGGER dbo.StudentAfterDelete 
ON dbo.Students 
AFTER DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @MemberID UNIQUEIDENTIFIER; 

    DECLARE c CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY 
    FOR SELECT MemberID FROM deleted; 

    OPEN c; 

    FETCH NEXT FROM c INTO @MemberID; 

    WHILE @@FETCH_STATUS <> -1 
    BEGIN 
    EXEC dbo.aspnet_delete_user @MemberID; 

    FETCH NEXT FROM c INTO @MemberID; 
    END 

    CLOSE c; 
    DEALLOCATE c; 
END 
GO 

動態SQL,同樣的假設:

CREATE TRIGGER dbo.StudentAfterDelete 
ON dbo.Students 
AFTER DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(MAX) = N''; 

    SELECT @sql += 'EXEC dbo.aspnet_delete_user ''' 
    + CONVERT(VARCHAR(36), MemberID) + ''';' FROM deleted; 

    EXEC sp_executesql @sql; 
END 
GO 

但是,包括缺少的信息預先更有用。不要以爲每個使用SQL Server的人都知道aspnet_delete_user的用處。

+0

以及我的過程的問題是,它需要一個用戶名作爲參數,所以如果我刪除多個學生,我不知道如何將這些用戶名傳遞給此Sp。使用循環?要麼 .. ? – 2012-02-22 22:13:05

+0

@reza謝謝你糾正這個問題,但我的目標不是讓你改變接受的答案,只是爲了解釋你是如何做出決定的,因爲它沒有遵循網站的指導原則。請完整查看http://meta.stackexchange.com/questions/19448/etiquette-for-selecting-answers和http://meta.stackexchange.com/questions/19585/accepting-a-duplicate-answer-etiquette。 – 2012-02-22 23:12:20

2

也許是這樣的:

CREATE TRIGGER TheNameOfTheTrigger 
ON YourTableYouWantToTriggerOn 
AFTER DELETE 
AS 
    DECLARE @yourPrimaryKey int 

    DECLARE delete_cursor CURSOR FOR 
    SELECT 
     yourPrimaryKey 
    FROM 
     deleted 

    OPEN delete_cursor 

    FETCH NEXT FROM delete_cursor 
    INTO @yourPrimaryKey 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     EXEC aspnet_delete_user @yourPrimaryKey 
     FETCH NEXT FROM delete_cursor INTO @yourPrimaryKey 
    END 

    CLOSE delete_cursor 
    DEALLOCATE delete_cursor 
GO 

查看更多信息herehere

+1

+1因爲我的意圖不是爲了竊取你的接受。 – 2012-02-23 00:13:45