2009-10-05 19 views
8

Ho creato molte tabelle nel mio database locale e le ho spostate nel database di produzione.Script T-SQL per copiare tutti i vincoli di tabella

ora sto lavorando sulla messa a punto della banca dati e ha creato molti vincoli sulle tabelle di database locali come PK, FK, valori predefiniti, indici ecc ecc

Ora vorrei copiare solo questi vincoli a database di produzione. C'è un modo per farlo?

Si noti che le tabelle del mio database di produzione sono già popolate con alcuni dati. Quindi non posso rilasciarli e ricrearli.

risposta

2

Red Gate SQL Compare è un modo popolare e non libero per eseguire questa operazione.

3

Il modo migliore sarebbe quello di memorizzare tutto il codice DDL in un controllo sorgente. Quindi distribuirlo alla produzione utilizzando strumenti come dbGhost (il mio preferito) o SQL Compare

+0

Ho usato DbGhost per 10 anni e non mi ha mai deluso, non vorrei provare lo sviluppo SQL su media scala senza di esso. – penderi

+0

Un'altra opzione che uso da molto tempo è AdeptSQL Diff. Non è gratuito, ma confronta schemi e dati, è molto veloce e può generare script di aggiornamento E ESEGUIRE direttamente dall'interno dell'applicazione. Anche ottenere gli script sotto il controllo della versione è importante. – DarinH

16

Se non si desidera acquistare alcun utensile (che valga totalmente il suo prezzo, BTW), è sempre possibile interrogare le viste del catalogo di sistema e estrai le informazioni da lì per creare script che potresti eseguire sul tuo nuovo database.

Nel caso di ad es. i vincoli di default, questa query vi mostra una lista di tutti i vincoli di default nel database:

SELECT 
    dc.name 'Constraint Name', 
    OBJECT_NAME(parent_object_id) 'Table Name', 
    c.name 'Column Name', 
    definition 
FROM 
    sys.default_constraints dc 
INNER JOIN 
    sys.columns c ON dc.parent_object_id = c.object_id 
        AND dc.parent_column_id = c.column_id 
ORDER BY 
    OBJECT_NAME(parent_object_id), c.name 

e sulla base di questo, si potrebbe naturalmente creare una query che emettono istruzioni T-SQL per ricreare quei vincoli predefiniti sul server di destinazione:

SELECT 
    'ALTER TABLE ' + OBJECT_SCHEMA_NAME(dc.parent_object_id) + '.' + OBJECT_NAME(dc.parent_object_id) + 
    ' ADD CONSTRAINT ' + dc.name + ' DEFAULT(' + definition 
    + ') FOR ' + c.name 
FROM 
    sys.default_constraints dc 
INNER JOIN 
    sys.columns c ON dc.parent_object_id = c.object_id 
        AND dc.parent_column_id = c.column_id 

si otterrebbe qualcosa di simile (per il campione AdventureWorks DB):

ALTER TABLE dbo.Store ADD CONSTRAINT DF_Store_rowguid DEFAULT((newid())) FOR rowguid 
ALTER TABLE dbo.Store ADD CONSTRAINT DF_Store_ModifiedDate DEFAULT((getdate())) FOR ModifiedDate 
ALTER TABLE dbo.ProductPhoto ADD CONSTRAINT DF_ProductPhoto_ModifiedDate DEFAULT((getdate())) FOR ModifiedDate 
ALTER TABLE dbo.ProductProductPhoto ADD CONSTRAINT DF_ProductProductPhoto_Primary DEFAULT(((0))) FOR Primary 
ALTER TABLE dbo.ProductProductPhoto ADD CONSTRAINT DF_ProductProductPhoto_ModifiedDate DEFAULT((getdate())) FOR ModifiedDate 
ALTER TABLE dbo.StoreContact ADD CONSTRAINT DF_StoreContact_rowguid DEFAULT((newid())) FOR rowguid 
ALTER TABLE dbo.StoreContact ADD CONSTRAINT DF_StoreContact_ModifiedDate DEFAULT((getdate())) FOR ModifiedDate 
ALTER TABLE dbo.Address ADD CONSTRAINT DF_Address_rowguid DEFAULT((newid())) FOR rowguid 

Naturalmente, si potrebbe t indebolire il T-SQL risultante in uscita a proprio piacimento - ma, in pratica, copiare & incollare quei risultati dalla query al nuovo database e si parte.

Ovviamente, esistono viste del catalogo di sistema simili per le relazioni con le chiavi esterne (sys.foreign_keys), i vincoli di controllo (sys.check_constraints), gli indici (sys.indexes e sys.index_columns) e molti altri.

È un po 'di lavoro, ma può essere fatto nel proprio tempo e imparerai molto su SQL Server nel processo.

quindi è un tradizionale "make or buy" decisione tutto da capo :-)

Marc

0

DBSourceTools provare. http://dbsourcetools.codeplex.com
Ha una funzione di confronto degli schemi che ti aiuterà a creare uno script di aggiornamento.
Tieni presente però che dovresti utilizzare il controllo del codice sorgente sull'intero database.
Questo è ciò che DBSourceTools è stato progettato per fare - aiutare gli sviluppatori a portare i loro database sotto il controllo del codice sorgente.

1

Sicuramente questo è un vecchio post, ma nessuno degli script in tutte le risposte precedenti espone anche gli schemi di tabella. Quindi non ha funzionato la scatola per il mio database.

Questo lo fa, così ha fatto:

-- =========================================================== 
-- Default Constraints 
-- How to script out Default Constraints in SQL Server 2005+ 
-- =========================================================== 

-- view results in text, to make copying and pasting easier 
-- drop default constraints 
SELECT 
    'ALTER TABLE ' + 
    QuoteName(OBJECT_SCHEMA_NAME(sc.id)) + '.' + QUOTENAME(OBJECT_NAME(sc.id)) + 
    CHAR(10) + 
    ' DROP CONSTRAINT ' + 
    QuoteName(OBJECT_NAME(sc.cdefault)) 
FROM 
    syscolumns sc 
    INNER JOIN 
    sysobjects as so on sc.cdefault = so.id 
    INNER JOIN 
    syscomments as sm on sc.cdefault = sm.id 
WHERE 
    OBJECTPROPERTY(so.id, N'IsDefaultCnst') = 1 

-- create default constraints 
SELECT 
    'ALTER TABLE ' + 
    QuoteName(OBJECT_SCHEMA_NAME(sc.id)) + '.' + QuoteName(OBJECT_NAME(sc.id)) + 
    ' ADD CONSTRAINT ' + 
    QuoteName(OBJECT_NAME(sc.cdefault))+ 
    ' DEFAULT ' + 
    sm.text + 
    ' FOR ' + QuoteName(sc.name) 
    + CHAR(13)+CHAR(10) 
FROM 
    syscolumns sc 
    INNER JOIN 
    sysobjects as so on sc.cdefault = so.id 
    INNER JOIN 
    syscomments as sm on sc.cdefault = sm.id 
WHERE 
    OBJECTPROPERTY(so.id, N'IsDefaultCnst') = 1 

ho adattato da Donabel Santos di blog here.

EDIT e NB: Assicurarsi di eseguire entrambe le parti della query e salvare il secondo set di risultati (cioè ADD CONSTRAINT s) prima di far cadere i vostri vincoli di default, altrimenti non sarà in grado di ricrearli di nuovo (no non l'ho fatto :)

Problemi correlati