Позвольте мне начать пытаться объяснить ... Моя база данных 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
Можете ли вы показать определение своего триггера? –
Возможно, вам следует удалить каскадное удаление и поместить триггер в заголовок, который удаляет и обновляет. – Steve
Простите мое невежество @Steve, не могли бы вы объяснить, как один триггер может делать стенд? – Randy