2009-10-05 9 views
8

He creado muchas tablas en mi base de datos local y las he movido a la base de datos de producción.Scripts de T-SQL para copiar todas las restricciones de la tabla

Ahora estoy trabajando en la puesta a punto de base de datos y crearon muchas limitaciones en mis tablas de bases de datos locales, tales como PK, FK, valores predeterminados, índices, etc., etc.

Ahora me gustaría copiar sólo a estas limitaciones base de datos de producción. ¿Hay una manera de hacerlo?

Tenga en cuenta que mis tablas de la base de datos de producción ya se han llenado con algunos datos. Entonces no puedo soltarlos y recrearlos.

Respuesta

3

La mejor manera sería almacenar todo el código DDL en un control de origen. Luego impleméntelo en producción usando herramientas como dbGhost (mi favorito) o SQL Compare

+0

He usado DbGhost durante 10 años y nunca me decepcionó, no intentaría el desarrollo de SQL a medio escala sin él. – penderi

+0

Otra opción que he usado durante mucho tiempo es AdeptSQL Diff. No es gratis, pero compara el esquema y los datos, es muy rápido y puede generar secuencias de comandos de actualización Y EJECUTARLAS directamente desde la aplicación. Obtener sus scripts bajo control de versiones también es importante. – DarinH

16

Si no quiere comprar ninguna herramienta (que vale totalmente su precio, por cierto), siempre puede consultar las vistas del catálogo del sistema, y extrae la información de allí para crear scripts que puedas ejecutar en tu nueva base de datos.

En el caso de, p. las restricciones predeterminadas, esta consulta se muestra una lista de todas las restricciones predeterminadas en su base de datos:

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 

y en base a eso, usted podría, por supuesto, crear una consulta que emiten instrucciones T-SQL para recrear esas restricciones predeterminadas en el servidor de destino:

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 

se obtendría algo como esto (para la muestra de 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 

por supuesto, usted podría t debilita la salida de T-SQL resultante a tu gusto, pero básicamente, copia & pega esos resultados de la consulta a tu nueva base de datos, y listo.

Por supuesto, hay vistas de catálogo de sistema similares para relaciones de claves foráneas (sys.foreign_keys), restricciones de comprobación (sys.check_constraints), índices (sys.indexes y sys.index_columns) y muchas más.

Es un poco de trabajo, pero se puede hacer en su propio tiempo, y aprenderá mucho sobre SQL Server en el proceso.

así que es un tradicional "hacer o comprar" decisión de nuevo :-)

Marc

0

DBSourceTools intento. http://dbsourcetools.codeplex.com
Tiene función de comparación de esquema que lo ayudará a crear un script de actualización.
Sin embargo, tenga en cuenta que debe usar el control de código fuente en toda su base de datos.
Esto es lo que DBSourceTools fue diseñado para hacer: ayudar a los desarrolladores a poner sus bases de datos bajo control de código fuente.

1

Claro, esta es una publicación anterior, pero ninguno de los scripts en todas las respuestas anteriores también muestra los esquemas de la tabla. Por lo tanto, no funcionó la caja para mi base de datos.

Esto lo hace, por lo que hizo:

-- =========================================================== 
-- 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 

que lo adaptaron a partir Donabel Santos de blog here.

EDITAR y NB: Asegúrese de ejecutar ambas partes de la consulta y guardar el segundo conjunto de resultados (es decir, ADD CONSTRAINT s) antes de dejar caer sus restricciones predeterminadas, de lo contrario no será capaz de volver a crearlos de nuevo (no, no lo hice :)

Cuestiones relacionadas