Equivalent de "cascade constraint" à la Oracle, en SQL server!
astuce pour supprimer une table référenciée par des contraintes étrangères sous SQL SERVER:
Juste pour partager ce script que je viens d'écrire que j'ai testé et qui répond à un besoin interessant, celui de pouvoir supprimer une table sous sql server, dont des colonnes sont susceptibles d'être référenciées par des clés étrangères d'autres tables.
Sous oracle c'est super simple : drop table 'tablename" cascade constraint
Mais sous sql server, l'équivalent de la syntaxe n'existe pas :-(. Bien entendu, l'option 'on delete cascade' permet de résoudre partiellement le problème. Dans tous les cas la référence existant, il sera impossible de supprimer la table référenciée. Pour cela, il suffit d'appeler cette procédure dans un premier temps qui supprimera toutes les références , en préservant vos données dans les tables concernées. Et enfin dans un second temps vous pourrez supprimer la table référenciée.
CREATE procedure [dbo].DeleteTableReferences (@database VARCHAR(50),@table nvarchar(50))
as
BEGIN
declare @schema nvarchar(128), @resultConstraints int,@tbl nvarchar(128), @constraint nvarchar(128)
DECLARE @sql nvarchar(255)
declare cur cursor fast_forward for
select distinct cu.constraint_schema, cu.table_name, cu.constraint_name
from information_schema.table_constraints tc
join information_schema.referential_constraints rc on rc.unique_constraint_name = tc.constraint_name
join information_schema.constraint_column_usage cu on cu.constraint_name = rc.constraint_name
where tc.constraint_catalog = @database and tc.table_name = @table
open cur
fetch next from cur into @schema, @tbl, @constraint
while @@fetch_status <> -1
begin
select @sql = 'ALTER TABLE ' + @schema + '.' + @tbl + ' DROP CONSTRAINT ' + @constraint
exec sp_executesql @sql
fetch next from cur into @schema, @tbl, @constraint
end
close cur
deallocate cur
END
Exemple:
On a une table TAB1 referencié par TAB2:
create table TAB2 (
client_id int not null references TAB1 (client_id),
groups_id int not null);
impossible de supprimer de TAB1, à cause de la référence définie par TAB2. De plus, cette référence n'est pas nommée donc impossible de la supprimer explicitement. Pour ce faire
DECLARE @RC int
DECLARE @database varchar(50)
DECLARE @table nvarchar(50)
-- Set parameter values
EXEC @RC = [PortfolioModule].[dbo].[DeleteTableReferences ] 'PortfolioModule', 'TAB1 '
drop table TAB1