вызовите aspnet_Delete_User SP в триггере - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть триггер в таблице студентов, который удаляет связанные записи из других таблиц при удалении студента.Я хочу удалить данные о членстве ученика, вызвав хранимую процедуру aspnet_delete_user в триггере.но это работает только если я удалю одного студента.и если я уберу несколько студентов в одном запросе, это не сработает.

Как вызвать этот SP для многострочного триггера операции?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Может быть что-то вроде этого:

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

Подробнее здесь и здесь

2 голосов
/ 23 февраля 2012

Вы должны использовать курсор или создать динамическую строку 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.

...