Voila une nouvelle option de SQL Server 2005 que je n'avais jamais utilisée : ON DELETE SET NULL
En 2000, on avait le ON DELETE CASCADE, qui lorsqu'une ligne de la table parente est effacée, efface automatiquement toute les lignes qui sont dans la table fille et dont les valeurs de clé étrangère sont celles référencées dans la ligne parent.
On a maintenant en 2005 le ON DELETE SET NULL : lorsqu’une ligne de la table parente est effacée, les lignes filles sont automatiquement modifiées pour que la colonne de la clé étrangère prenne la valeur de NULL. Cette contrainte ne peut être exécutée que si toutes les colonnes de clé étrangère de la table cible acceptent des valeurs NULL.
Il existe également une nouvelle option qui est ON DELETE SET DEFAULT : en cas de tentative de suppression d'une ligne possédant une clé référencée par des clés étrangères dans des lignes d'autres tables, toutes les valeurs qui composent la clé étrangère des lignes référencées prennent leur valeur par défaut. Cette contrainte ne peut être exécutée que si toutes les colonnes de clé étrangère de la table cible possèdent une définition par défaut. Si une colonne accepte des valeurs NULL et qu'aucune valeur par défaut explicite n'est définie, NULL devient la valeur par défaut implicite de la colonne.
Par défaut, lors de la création d'une clé étrangère, l'option du ON DELETE est positionné sur NO ACTION, dans ce cas, lors d'une tentative de suppression d'une ligne possédant une clé référencée par des clés étrangères dans des lignes d'autres tables, une erreur est générée et l'instruction DELETE est restaurée.
Pour changer l'option de règle de suppression, on peut exécuter une requête de ce style,
CREATE TABLE MaTable ( ID int IDENTITY(1,1), UserID int NULL, Valeur varchar(20) NOT NULL CONSTRAINT MaTable_PK PRIMARY KEY CLUSTERED (ID), CONSTRAINT MaTable_UserID_FK FOREIGN KEY (UserID) REFERENCES MonAutreTable (UserID) ON DELETE SET NULL ) GOou passer par la boîte de dialogue Relations de clé étrangère
L'interrogation de sys.foreign_keys indique la contrainte d'intégrité référentielle en cascade spécifiée pour une clé étrangère.
Remarque : Sur la version Katmaï CPT de Juin 2007, il n'y a pas de nouveauté de ce coté la !!