SQL, Cómo cambiar la columna en la tabla de SQL sin romper otras dependencias?
-
28-09-2019 - |
Pregunta
Estoy seguro de que esto podría ser muy consulta común, pero no pude encontrar una buena respuesta por ahora.
Aquí está mi pregunta:
Tengo una tabla llamada Contactos con la columna varchar Título . Ahora en medio de desarrollo quiero reemplazar el campo Título TitleID que es clave externa a Mesa ContactTitles . En la mesa momento Contactos tiene más de 60 dependencias (otras tablas, vistas funciones).
¿Cómo puedo hacer que la manera más fácil y segura?
Utilizamos: MSSQL 2005, los datos ya se ha migrado, sólo quieren a cambio de esquema
.Editar:
Gracias a todos por la repetición rápida.
Como se mencionó Contactos tabla tiene más de 60 personas a cargo, pero cuando se ejecutó siguiente consulta, sólo 5 de ellos utilizan Título columna. La migración se llevó a cabo la escritura, por lo que los cambios requeridos no hay datos.
/*gets all objects which use specified column */
SELECT Name
FROM syscomments sc
JOIN sysobjects so ON sc.id = so.id
WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'
Luego pasó por esos 5 puntos de vista y los actualiza manualmente.
Solución
Para Microsoft SQL Server Redgate tiene un producto (no libre) que puede ayudar con esta refactorización http://www.red-gate.com/products/sql_refactor/index.htm
En el pasado he logrado hacer esto con bastante facilidad (si primitivamente) simplemente por obtener una lista de cosas a la revisión
SELECT * FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%'
(y posiblemente teniendo información dependencias en cuenta y filtrar por tipo de objeto)
Scripting todos los de interés en la gestión Estudio entonces simplemente ir por la lista y la revisión de todos ellos y cambiar el crear para modificar. Debe ser bastante simple y el cambio repetitivo incluso para 60 posibles dependencias. Además, si usted se refiere a una columna inexistente debería obtener un mensaje de error cuando se ejecuta la secuencia de comandos para alterar.
Si utiliza *
en sus consultas o SQL adhoc en sus aplicaciones, obviamente, las cosas pueden ser un poco más difícil.
Otros consejos
refactorización métodos. Comience por la creación de un nuevo campo llamado TitleID
, a continuación, copiar todos los títulos en la tabla ContactTitles
. Luego, uno por uno, actualice cada una de las dependencias a utilizar el campo TitleID. Sólo asegúrese de que todavía tienes un sistema de trabajo después de cada paso.
Si los datos se va a cambiar, usted tiene que tener cuidado y asegurarse de que cualquier cambio en la columna de la Title
también cambian la tabla ContactTitles
. Usted lo único que tiene que mantenerlos sincronizados mientras estás haciendo la refactorización.
Editar Hay incluso un libro sobre él! Refactoring Bases de datos .
Como otros señalaron que depende de su RDBMS.
Hay dos enfoques:
- hacer un cambio en la tabla y corregir todas las dependencias
- hacer una vista que se puede utilizar en lugar de un acceso directo a la tabla (esto se puede evitar futuros cambios en la tabla núcleo subyacente (s), pero es posible perder algo de la funcionalidad de actualización, dependiendo de su DBMS)
Uso SP_Depend 'Nombre de la tabla' para comprobar las dependencias de la tabla y luego usar el sp_rename cambiar el nombre del nombre de columna que es muy útil. sp_rename cambia automáticamente el nombre del índice asociado cada vez que se cambia el nombre de una restricción PRIMARY KEY o UNIQUE. Si un índice ha cambiado el nombre está ligado a una restricción PRIMARY KEY, la restricción PRIMARY KEY también se renombra automáticamente por sp_rename.
y luego iniciar la actualización del procedimiento y funciones de uno en uno no hay otra opción buena para el cambio como éste si luego me encontré dice también.