2010-09-16 17 views
13

Retitulé una tabla en mi base de datos con¿Cómo puedo cambiar el nombre de mis limitaciones

EXEC sp_rename 'tblOldAndBusted', 'tblNewAndShiny' 

y todas las restricciones de claves foráneas se han actualizado para el nuevo nombre de la tabla, pero que todavía están nombradas basan en el antiguo nombre de la tabla . Por ejemplo, ahora tengo FK_tblOldAndBusted_tblTastyData pero me gustaría tener FK_tblNewAndShiny_tblTastyData.

¿Hay alguna manera fácil de escribir esto?

Además, ¿estoy siendo demasiado anal? Sé que la base de datos funciona bien con el nombre de la tabla anterior en las restricciones, pero se siente como broken windows.

+5

esto no es anal, cuando obtiene un error de restricción, es bueno tener el nombre y la columna de la tabla como parte del nombre de la restricción, para que pueda resolver el problema. si el nombre de la restricción tiene un nombre de tabla incorrecto, eso solo le causará cierta demora en resolver el problema. –

+2

Eso no es anal, eso es penal. –

Respuesta

20

Probar:

exec sp_rename 'FK_tblOldAndBusted_tblTastyData', 'FK_tblNewAndShiny_tblTastyData', 'object' 

Además, hay un error en relación con el cambio de nombre este tipo de cosas cuando se trabaja con schema no predeterminada.

Cannot rename a default constraint for a table in a schema which is not dbo by rsocol @Microsoft Connect

+0

FYI, el error está en estado cerrado en un enlace determinado. – ManirajSS

+1

Para aquellos que usan 'sp_rename' con objetos que tienen un punto en el nombre (a las restricciones creadas por EntityFramework), necesitarás poner entre corchetes el parámetro' @ objname', así como incluir ''OBJECT'' como' @ parámetro objtype': 'sp_rename exec @objname = '[dbo] [FK_dbo.TableA_dbo.TableB_ColumnOne].', @newname = 'FK_dbo.TableA_dbo.TableC_ColumnOne', @objtype = 'objeto';' – dperish

0

Si hay demasiados para cambiar el nombre, ¿qué hay de exportación a volcar, editar el vertedero en cualquier editor de texto de elección para reemplazar el nombre de la tabla, y luego restaurar de volcado? Me refiero a exportar el vertedero de solo restricciones, no todas.

+0

idea interesante , pero en mi situación tengo que crear un script que se pueda usar para hacer los mismos cambios en otras copias de la base de datos. Por cierto, es menos de 10 mesas, por lo que no es un gran problema. –

+0

Ok. Tuve que usar dicho método cuando uno de mis MySQL DB se migró de Windows a Amazon RDS. Tenemos todos los nombres de las tablas en mayúsculas, mientras que DUMP que obtuvimos de Windows tenía todas las minúsculas. Y en RDS, y en Linux, los nombres de tabla MySQL distinguen entre mayúsculas y minúsculas. –

2

Si alguien está interesado, solo tuve que cambiar el nombre de todas las restricciones predeterminadas para un campo de auditoría llamado "FechaIntroducida" a un patrón específico. Actualiza y reemplaza según sea necesario. Espero que esto ayude y pueda ser un punto de partida.

DECLARE @TableName VARCHAR(255), @ConstraintName VARCHAR(255) 
DECLARE constraint_cursor CURSOR 
    FOR 
     select b.name, c.name from 
     sys.all_columns a 
     inner join 
     sys.tables b 
     on 
     a.object_id = b.object_id 
     inner join 
     sys.default_constraints c 
     on a.default_object_id = c.object_id 
     where 
      b.name <> 'sysdiagrams' 
      and a.name = 'EnteredDate' -- column name 
      and b.type = 'U' 

OPEN constraint_cursor 
FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @SqlScript VARCHAR(255) = '' 
     SET @SqlScript = 'sp_rename ' + @ConstraintName + ', ''DF_' + @TableName + '_EnteredDate'', ''object''' 
     EXEC(@SqlScript) 
     SELECT @TableName, @ConstraintName, 'DF_' + @TableName + '_EnteredDate', @SqlScript 
     FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName 
    END 
CLOSE constraint_cursor; 
DEALLOCATE constraint_cursor; 
0

Después de un poco más de excavación, descubrí que en realidad tiene que ser en esta forma: la escritura

EXEC sp_rename N'schema.MyIOldConstraint', N'MyNewConstraint', N'OBJECT' 

Source

0

de user906573 base. Genere una secuencia de comandos para cambiar el nombre de todos los valores predeterminados en la base de datos. Útil para corregir restricciones que no fueron nombradas explícitamente en el momento de creación.

-- 
-- Generates a script to rename defaults to the pattern DF_tablename_columnname 
-- 

DECLARE @TableName VARCHAR(255), @ConstraintName VARCHAR(255), @ColumnName varchar(255), @SchemaName varchar(255) 
DECLARE constraint_cursor CURSOR 
    FOR 
     select b.name, c.name, a.name, sc.name 
     from sys.all_columns a 
     inner join sys.tables b on a.object_id = b.object_id 
     join sys.schemas sc on b.schema_id = sc.schema_id 
     inner join sys.default_constraints c on a.default_object_id = c.object_id 
     where 
      b.name <> 'sysdiagrams' 
      and b.type = 'U' 

OPEN constraint_cursor 
FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName, @ColumnName, @SchemaName 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @SqlScript VARCHAR(255) = '' 
     SET @SqlScript = 'sp_rename ''' + @SchemaName + '.' + @ConstraintName + ''', ''' + @SchemaName + '.DF_' + @TableName + '_' + @ColumnName + ''', ''object''' + char(13) + char(10) + 'GO' + char(13) + char(10) 
     --EXEC(@SqlScript) 
     print @sqlscript 
     FETCH NEXT FROM constraint_cursor INTO @TableName, @ConstraintName, @ColumnName, @SchemaName 
    END 
CLOSE constraint_cursor; 
DEALLOCATE constraint_cursor; 
3

No soy un gran fan de los cursores y esto se puede escribir de forma mucho más simple.

DECLARE @SQLCmd varchar(MAX) = '' 
SELECT 
    @SQLCmd += 'EXEC sp_rename ''' + dc.name + ''', ''DF' + 
       OBJECT_NAME(dc.parent_object_id) + c.name + ''', ''OBJECT'';' 
FROM 
    sys.default_constraints dc 
    JOIN sys.columns c 
     ON c.object_id = dc.parent_object_id 
     AND c.column_id = dc.parent_column_id 
WHERE 
    dc.name != 'DF' + object_name(dc.parent_object_id) + c.name 
    AND OBJECT_NAME(dc.parent_object_id) != 'dtproperties' 
EXEC(@SqlCmd) 
0

Sé que este hilo está un poco anticuado, pero quería publicar mi alternativa a la respuesta de @ foxfire ya que le hice algunas modificaciones. Hice que tomara un trozo más pequeño de los nombres cuando me encontré con la base de datos donde había tantos cambios de nombre que hizo truncar a @sql. También agregué el manejo de errores para romper así como los nombres de esquema para manejar diferentes esquemas distintos de dbo. Decidí no usar una prueba de inicio para que se pudiera usar entre múltiples versiones de servidor sql. La cláusula where se puede manipular para cumplir con la intención original del OP.

BEGIN TRAN 

DECLARE @sql varchar(MAX) = '...' 

WHILE LEN(@sql) > 0 BEGIN 
     SET @sql = ''; 

     SELECT TOP 50 @sql = @sql 
       + 'EXEC sp_rename N''' + SCHEMA_NAME(dc.[schema_id]) + '.' + dc.name 
       + ''', N''DF_' + OBJECT_NAME(dc.parent_object_id) + '_' + c.name 
       + ''', ''OBJECT'';' + CHAR(10) 
     FROM sys.default_constraints dc 
     inner join sys.columns c 
       ON c.object_id = dc.parent_object_id AND c.column_id = dc.parent_column_id 
     WHERE dc.name LIKE 'DF[_][_]%' -- rename any auto named defaults 

     PRINT @sql 
     EXEC(@sql) 

     IF @@ERROR <> 0 BEGIN 
       IF @@TRANCOUNT > 0 ROLLBACK TRAN 
       BREAK; 
     END 
END 

IF @@TRANCOUNT > 0 COMMIT TRAN 
--IF @@TRANCOUNT > 0 ROLLBACK TRAN 
Cuestiones relacionadas