2014-09-11 3 views
0

Позвольте мне начать пытаться объяснить ... Моя база данных MSSQL2008 R2 имеет две таблицы, одна называется SalesHeader другие SalesDetails. Если я удалю запись заголовка, он каскадирует и удаляет все данные, связанные с этим заголовком. У меня также есть триггер delete на таблице SalesDetails, в котором перечислены DetailNumber поле для получения дополнительной информации.Как отключить триггер, когда каскад на Delete, если уволили

Cascade on delete работал до того, как я ввел триггер в таблицу Details. Теперь триггер работает, но я получаю сообщение об ошибке при попытке удалить запись заголовка. Я могу вручную отключить триггер delete в таблице подробностей, и удаление заголовка работает, как ожидалось.

Чтобы исправить это, я не совсем уверен, будет ли работать новый триггер delete в таблице заголовков, который отключит триггер в таблице подробностей, или если есть способ обнаружить Cascade on Delete в триггере Details, логика триггера может быть обойдена. Я прочитал здесь о SO, что INSTEAD OF DELETE Триггеры не разрешены с помощью Cascade on Delete.

Любые предложения были бы очень признательны и фрагменты кода еще более.

Приветствия,

SQL Trigger:

USE [MyDatabase] 
    GO 

    /****** Object: Trigger [dbo].[OnDeleteTrigger] Script Date: 9/11/2014 11:51:40 AM ******/ 
    SET ANSI_NULLS ON 
    GO 

    SET QUOTED_IDENTIFIER ON 
    GO 


    -- ============================================= 
    -- Author:  Randy Gordey 
    -- Create date: 08/28/2014 
    -- Description: Renumbers the remaining details 
    --    when rows are deleted. 
    -- ============================================= 
    CREATE TRIGGER [dbo].[OnDeleteTrigger] 
     ON [dbo].[SalesDetail] 
     AFTER DELETE 
    AS 
    BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
    PRINT 'Delete Trigger Fired' 
    DECLARE @ID int 
    DECLARE @RowNum int 
    DECLARE @TransactionNumber int 

    -- Gets the TransactionNumber from the deleted row 
    SET @TransactionNumber = (SELECT 
     intTransactionNumber 
    FROM DELETED) 

    DECLARE myCursor CURSOR 

    /** Gets a collection of the detail lines for this Transaction **/ 
    LOCAL SCROLL STATIC FOR SELECT 
     intDetailNumber, 
     ROW_NUMBER() OVER (ORDER BY intDetailNumber) AS 'RowNum' 
    FROM SalesDetail 
    WHERE intTransactionNumber = @TransactionNumber; 

    OPEN myCursor; 

    -- Grabs the first row 
    FETCH NEXT FROM myCursor INTO @ID, @RowNum; 

    -- Begin Loop 
    WHILE @@FETCH_STATUS = 0 BEGIN 

    /** Updates Database: Setting new Detail Number for each row. **/ 
    UPDATE SalesDetail 
    -- intDetailNumber is part of the PrimaryKey but it is not 
    -- set as an identity, so we can still change it. 
     SET intDetailNumber = @RowNum 
     WHERE intDetailNumber = @ID 
     AND intTransactionNumber = @TransactionNumber; 

    -- Grabs the next row 
    FETCH NEXT FROM myCursor INTO @ID, @RowNum; 

    END; 
    CLOSE myCursor; 
    DEALLOCATE myCursor; 

    END 
    GO 
+0

Можете ли вы показать определение своего триггера? –

+0

Возможно, вам следует удалить каскадное удаление и поместить триггер в заголовок, который удаляет и обновляет. – Steve

+0

Простите мое невежество @Steve, не могли бы вы объяснить, как один триггер может делать стенд? – Randy

ответ

0

Я нашел свое исправление.

SET @Count = (SELECT 
    COUNT(*) 
    FROM DELETED) 

    -- We want to break for multiple rows (ON DELETE CASCADE) 
    IF (@Count > 1) RETURN 

Я удаляю только отдельные строки из ChildTable за один раз. Я также хочу сохранить каскад при удалении - поскольку у моего ChildTable есть свои дети.

Смежные вопросы