Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
share Thinking ...
share Thinking ...
  • I am an engineer in computer science. Software building is one of my first passions. I have a little more than 3 professional experience years....I won't let you discover all about me now, let's share here a while, maybe i will provide the help you need.
  • Accueil du blog
  • Créer un blog avec CanalBlog
Publicité
share Thinking ...
6 février 2008

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

Publicité
Publicité
Commentaires
Publicité