Domanda

Voglio evitare che un record specifico dall'eliminazione. Questo trigger funziona bene per quello record specifico. Tuttavia, altri record rimangono ancora quando sono in fase di eliminazione. Perché?

 ALTER TRIGGER [Globalization].[CountriesTracker] 
 ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
 BEGIN
SET NOCOUNT ON;
IF ((Select COUNT(*) from [Deleted]
     Where [Deleted].[CountryId] = '36bd1536-fb56-4ec4-957e-1b3afde16c56') = 1)
BEGIN       
    RAISERROR('You can not delete this specific record!', 0, 0)
    ROLLBACK TRANSACTION
    RETURN
END
END

Come posso garantire che righe non corrispondenti alla condizione di cui sopra vengono eliminati come previsto?

È stato utile?

Soluzione

Si dispone di un trigger INSTEAD OF quindi è necessario un vero e proprio DELETE in esso.

Vorrei anche prendere in considerazione semplicemente filtrare la fila protetta fuori perché:

  • Avete bisogno di un lancio errore? O in silenzio ignorare?
  • Che dire di eliminazioni di fila multipli che contengono la fila protetta:? Annullare l'intero, o eliminare il resto

Qualcosa di simile:

ALTER TRIGGER [Globalization].[CountriesTracker]  ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
SET NOCOUNT ON;

DELETE
   CT
FROM
   [Globalization].[Countries] C
   JOIN
   DELETED D ON C.CountryId = D.CountryId
WHERE
    [Deleted].[CountryId] <> '36bd1536-fb56-4ec4-957e-1b3afde16c56'
 GO

Altri suggerimenti

Poiché si tratta invece di ancora necessario eseguire l'operazione di eliminazione per il caso di default.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top