2015-04-24 16 views
9

Sto eseguendo alcuni DB Admin con un database di Azure e ho bisogno di eseguire query come rimuovere tutti i vincoli nel database.SQL Rimuovi tutti i vincoli Azure Friendly

sp_MSForEachTable non è disponibile quando si lavora con i database di Azure, quindi sto lavorando su un modo diverso per farlo.

Ho trovato un frammento che cade tutte le tabelle qui: http://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-azure-friendly/ e ha cercato di modificarlo per rimuovere tutti i vincoli come ho bisogno di e si avvicinò con questo risultato:

while(exists(select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME != '__MigrationHistory')) 
begin 
    PRINT ('Disabling' + TABLE_NAME) 
    declare @constraintOff nvarchar(2000) 
    SELECT TOP 1 @constraintOff=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] ' + 'NOCHECK CONSTRAINT all') 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME != '__MigrationHistory' 
    exec (@constraintOff) 
    PRINT @constraintOff 
end 

Si tenta ripetutamente di operare sulla prima voce nel database, che funzionerebbe bene se stavi rilasciando tutto ma ho bisogno di scorrere ogni tabella e disabilitare il suo vincolo come fa sp_MSForEachTable.

Qualche consiglio? Ho visto alcune cose qua e là che pretendono di farlo, ma di solito sono script di due o tre pagine che fanno un sacco di altre cose e mi fanno male al cervello.

UPDATE

ancora lavorando su quella query, sembra che qualcosa in tal senso potrebbe funzionare meglio, ma ancora niente da fare:

declare @constraintOff nvarchar(2000) 
SELECT @constraintOff=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] ' + 'NOCHECK CONSTRAINT all') 
FROM INFORMATION_SCHEMA.TABLES 
exec (@constraintOff) 
PRINT @constraintOff 

Questo ancora funziona solo su un tavolo, ma almeno è non un ciclo infinito :)

+1

So che questo è per Amazon RDS, ma c'è una sezione sulla disabilitazione dei vincoli: http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.html che potrebbe essere utile. – Nate

+1

che era esattamente ciò che il medico ha ordinato, c'erano snippet specifici per aggiungere e rimuovere tutti i vincoli, se li metti in un post lo contrassegnerò come risposta – Eric

risposta

6

Anche se questo collegamento è per Amazon RDS, fornisce codice specifico per disabilitare i vincoli senza sp_MSForEachTable

Importing and Exporting SQL Server Data

-- Manually specify database name - a safeguard in case you paste this into the wrong SSMS window. 
USE [staging] 

-- Change this line if you want to enable (1) or disable constraints: 
DECLARE @enable_constraints bit = 0 

--Don't change anything below this line. 
DECLARE @schema_name SYSNAME 
DECLARE @table_name SYSNAME 

DECLARE table_cursor CURSOR FOR 
SELECT 
    schemas.name, 
    tables.name 
FROM 
    sys.tables 
    INNER JOIN sys.schemas ON tables.schema_id = schemas.schema_id 

OPEN table_cursor 
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name 

DECLARE @cmd varchar(200) 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @cmd = 'ALTER TABLE ' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@table_name) + ' ' 
    SET @cmd = @cmd + (CASE WHEN @enable_constraints = 1 THEN 'CHECK' ELSE 'NOCHECK' END) + ' CONSTRAINT ALL' 

    PRINT @cmd 
    EXEC(@cmd) 

    FETCH NEXT FROM table_cursor INTO @schema_name, @table_name 
END 

CLOSE table_cursor 
DEALLOCATE table_cursor 
+4

Per disabilitarlo dovrebbe essere 'SELECT @cmd = 'ALTER TABLE' + QUOTENAME (@table_name) + 'WITH NO CHECK CONSTRAINT ALL'; ' E per riattivare dovrebbe essere: ' SELECT @cmd = 'ALTER TABLE' + QUOTENAME (@table_name) + ' CON CONTROLLO COSTITUISCE VINCITORE '; ' – tumtumtum

+1

In realtà correzione. Il codice di disabilitazione non ha bisogno del "CON". Il ri-abilitazione fa. – tumtumtum

+0

NO CHECK deve essere una parola: 'SELECT @cmd = 'ALTER TABLE' + QUOTENAME (@table_name) + 'NOCHECK CONSTRAINT ALL';' – AndyMcKenna

2

Esteso lo script a che fare con tabelle in schemi diversi, anche corretto lo script precedente che non è invalidante controlli:

-- DISABLE ALL CONSTRAINTS 
DECLARE @table_name SYSNAME; 
DECLARE @schema_name SYSNAME; 
DECLARE @cmd NVARCHAR(MAX); 
DECLARE table_cursor CURSOR FOR 
    SELECT s.name, t.name 
    FROM sys.tables t 
    join sys.schemas s on t.schema_id = s.schema_id 

OPEN table_cursor; 
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name; 

WHILE @@FETCH_STATUS = 0 BEGIN 
    SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@schema_name)+'.'+QUOTENAME(@table_name)+' NOCHECK CONSTRAINT ALL'; 
    EXEC (@cmd); 
    FETCH NEXT FROM table_cursor INTO @schema_name, @table_name; 
END 

CLOSE table_cursor; 
DEALLOCATE table_cursor; 


-- enable all constraints 
DECLARE table_cursor CURSOR FOR 
    SELECT s.name, t.name 
    FROM sys.tables t 
    join sys.schemas s on t.schema_id = s.schema_id 

OPEN table_cursor; 
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name; 

WHILE @@FETCH_STATUS = 0 BEGIN 
    SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@schema_name)+'.'+QUOTENAME(@table_name)+' CHECK CONSTRAINT ALL'; 
    EXEC (@cmd); 
    FETCH NEXT FROM table_cursor INTO @schema_name, @table_name; 
END 

CLOSE table_cursor; 
DEALLOCATE table_cursor; 
Problemi correlati