Abilitare e disabilitare i vincoli su un database SQL Server


Due stored procedure per abilitare e disabilitare i vincoli su un database SQL Server. Alcune volte per operazioni di manutenzione o per importare dei dati nel database SQL Server occorre disabilitare tutti i vincoli presenti per evitare errori durante le procedure. Ovviamente è sempre sconsigliato eliminare tutti i vincoli, perchè si potrebbero fare degli errori durante la nuova creazione degli stessi.

SQL server mette a disposizione un comando per disabilitare i vincoli:

ALTER TABLE NomeTabella NOCHECK CONSTRAINT ALL

Se dovessimo farlo su tutto il database, dovremmo a mano andare a scrivere questa istruzione per ogni tabella presente. Con il rischio di fare errori. Per questo ho scritto due semplici stored procedure che automatizzano questa operazione.

La prima permette di abilitare o disabilitare i vincoli su una tabella

-- =============================================
-- Author: <ideativi.it>
-- Create date: <01/10/2010>
-- Description: <Abilitazione e disabilitazione dei vincoli di una tabella>
-- =============================================
CREATE PROCEDURE [dbo].[spFrameworkAbilitaDisabilitaVincoliTabella]
@NomeTabella varchar(128),
@Abilita BIT = 1
AS
DECLARE @SQL VARCHAR(500)
IF @Abilita = 0 
BEGIN 
SET @SQL = 'ALTER TABLE '+ @NomeTabella + ' NOCHECK CONSTRAINT ALL' 
END
ELSE 
BEGIN 
SET @SQL = 'ALTER TABLE ' + @NomeTabella + ' CHECK CONSTRAINT ALL' 
END
EXEC (@SQL)

La seconda effettua un ciclo fra tutte le tabelle del database e richiama la prima stored procedure.

-- =============================================
-- Author: <ideativi.it>
-- Create date: <01/10/2010>
-- Description: <Permette di abilitare o disattivare i vincoli su tutto il database>
-- =============================================
CREATE PROCEDURE [dbo].[spFrameworkAbilitaDisabilitaVincoliDataBase]
@Abilita BIT = 1
AS

DECLARE @NomeTabella as varchar(max)
DECLARE curTabella CURSOR FOR SELECT Table_Name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
OPEN curTabella
FETCH NEXT FROM curTabella INTO @NomeTabella
WHILE @@FETCH_STATUS = 0 
BEGIN 
print ('Elaborazione Tabella: ' +@NomeTabella) 
exec spFrameworkAbilitaDisabilitaVincoliTabella @NomeTabella, @Abilita 
FETCH NEXT FROM curTabella INTO @NomeTabella 
END
CLOSE curTabella
DEALLOCATE curTabella

L'interfaccia della stored è molto semplice. Il parametro @Abilita è un booleano è permette di abilitare con true o disabilitare con false i vincoli dell'intero database.

Post correlati: