Avant de savoir si l'on peut supprimer une ligne dans une base de données, il est bon de se poser la question : Est-elle référencée dans d'autres tables cette ligne ?
Pour se faire il suffit de suivre à l'envers les contraintes de foreign key de la base de données
voici une procédure utile :
CREATE PROCEDURE dbo.can_delete
@table VARCHAR(100), @Id INT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Command VARCHAR(MAX)
SELECT @Command = ISNULL(@Command + ' UNION ALL ', '') + ' SELECT ''' + SCHEMA_NAME(tbl.schema_id) + '.' + tbl.name +
''' AS [table] WHERE EXISTS(SELECT * FROM ' + SCHEMA_NAME(tbl.schema_id) + '.' + tbl.name
+ ' WHERE ' + col.name + ' = ' + CAST(@Id AS VARCHAR) + ')'
FROM sys.foreign_key_columns fkc
INNER JOIN sys.tables tbl ON fkc.parent_object_id = tbl.object_id
INNER JOIN sys.columns col ON fkc.parent_object_id = col.object_id AND fkc.parent_column_id = col.column_id
WHERE OBJECT_NAME(fkc.referenced_object_id) = @table
EXECUTE (@Command);
END
A Noter dans cette procédure :
On créer une variable @commande qui va contenir une requête SQL construite dynamiquement et qui renvéra le résultat. Noter que le paramètre @command de la commande EXECUTE est entre parenthèses.
La requête fait appel à la table système de SQL SERVER ; sys.foreign_key_column qui maintient les Foreign Keys de la base de données
ATTENTION : Cette procédure ne fonctionne que si la clé primaire de la table concernée, n'est formé que d'une seule colonne (en général un entier auto incrémenté)
Aucun commentaire:
Enregistrer un commentaire