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.