【问题标题】:call aspnet_Delete_User SP in trigger在触发器中调用 aspnet_Delete_User SP
【发布时间】:2012-02-22 21:52:52
【问题描述】:

我在学生表中有一个触发器,当我删除学生时,它会从其他表中删除相关记录。我想通过在触发器中调用 aspnet_delete_user 存储过程来删除学生的会员数据。但这仅在我删除一名学生时才有效。如果我在一个查询中删除多个学生,它就不起作用。

多行操作触发器如何调用这个SP?

【问题讨论】:

  • aspnet_delete_user 采用什么参数?哪个参数映射到inserted 伪表中的哪个列?

标签: sql-server-2008 triggers asp.net-membership


【解决方案1】:

您必须使用游标或构建动态 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 做了什么。

【讨论】:

  • 这个过程的问题是它需要一个用户名作为参数,所以如果我删除多个学生,我不知道如何将这些用户名传递给这个 Sp 。使用循环?或..?
  • @reza 感谢您纠正此问题,但我的目标不是让您更改已接受的答案,只是为了解释您是如何做出决定的,因为它没有遵循该网站的指南.请完整查看meta.stackexchange.com/questions/19448/…meta.stackexchange.com/questions/19585/…
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多