Pergunta

Eu quero criar um gatilho para verificar o que está sendo excluído contra regras de negócio e, em seguida, cancelar a eliminação, se necessário. Alguma idéia?

A solução utilizada a vez de disparador de exclusão. O tran reversão parou a exclusão. Eu tinha medo que eu teria um problema em cascata quando eu fiz a exclusão, mas isso não parece acontecer. Talvez um gatilho não pode desencadear-se.

Foi útil?

Solução

Use um INSTEAD OF DELETE (ver MSDN ) gatilho e decidir dentro do trigger o que você realmente quer fazer.

Outras dicas

A solução utilizada a vez de disparador de exclusão. O tran reversão parou a exclusão. Eu tinha medo que eu teria um problema em cascata quando eu fiz a exclusão, mas que fez'nt parecem acontecer. Talvez um gatilho não pode desencadear-se. De qualquer forma, graças a todos por sua ajuda.

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

O gatilho pode reverter a transação atual, que terá o efeito de cancelar a eliminação. Como o cartaz acima também afirma, você também pode usar uma vez de gatilho.

De acordo com a documentação do MSDN sobre gatilhos INSTEAD OF DELETE:

A tabela excluída enviado para um DELETE gatilho contém uma imagem das linhas como existiam antes da exclusão foi emitido comunicado.

Se eu entendi corretamente o DELETE é realmente sendo executado. O que eu estou ausente?

De qualquer forma, eu não entendo por que você deseja excluir os registros e se as regras de negócio não são passados ??então undelete esses registros. Eu teria juro deve ser mais fácil para testar se você passar as regras de negócio antes de excluir os registros.

E eu teria dito uso de uma transação, eu não ouvi antes sobre gatilhos INSTEAD OF.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top