Как отменить удаление в SQL - PullRequest
9 голосов
/ 29 октября 2008

Я хочу создать триггер, чтобы проверить, что удаляется в соответствии с бизнес-правилами, а затем отменить удаление, если необходимо. Есть идеи?

В решении использовался триггер вместо удаления. Откат тран остановил удаление. Я боялся, что у меня возникнет каскадная проблема при удалении, но, похоже, этого не произошло. Возможно, триггер не может сработать сам.

Ответы [ 4 ]

19 голосов
/ 29 октября 2008

Используйте триггер INSTEAD OF DELETE (см. MSDN ) и решите в триггере, что вы действительно хотите сделать.

7 голосов
/ 29 октября 2008

В решении использовался триггер вместо удаления. Откат тран остановил удаление. Я боялся, что у меня возникнет каскадная проблема при удалении, но, похоже, этого не произошло. Возможно, триггер не может сработать сам. В любом случае, спасибо всем за помощь.

ALTER TRIGGER [dbo].[tr_ValidateDeleteForAssignedCalls]
on [dbo].[CAL]
   INSTEAD OF DELETE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @RecType VARCHAR(1)
    DECLARE @UserID VARCHAR(8)
    DECLARE @CreateBy VARCHAR(8)
    DECLARE @RecID VARCHAR(20)

    SELECT @RecType =(SELECT RecType FROM DELETED)
    SELECT @UserID =(SELECT UserID FROM DELETED)
    SELECT @CreateBy =(SELECT CreateBy FROM DELETED)
    SELECT @RecID =(SELECT RecID FROM DELETED)

     -- Check to see if the type is a Call and the item was created by a different user
    IF @RECTYPE = 'C' and not (@USERID=@CREATEBY)

    BEGIN
        RAISERROR ('Cannot delete call.', 16, 1)
        ROLLBACK TRAN
        RETURN
    END

     -- Go ahead and do the update or some other business rules here
    ELSE
        Delete from CAL where RecID = @RecID    

END
1 голос
/ 29 октября 2008

Согласно документации MSDN о INSTEAD OF DELETE триггерах:

Удаленная таблица отправлена ​​на УДАЛИТЬ триггер содержит изображение строк как они существовали до УДАЛЕНИЯ Выписка выдана.

Если я правильно понимаю, DELETE фактически выполняется. Чего мне не хватает?

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

И я бы сказал, используйте транзакцию, я раньше не слышал о INSTEAD OF триггерах.

1 голос
/ 29 октября 2008

Триггер может откатить текущую транзакцию, что приведет к отмене удаления. Как видно из вышеприведенного плаката, вы также можете использовать вместо триггера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...