Pregunta

¿Hay alguna manera de combinar dos claves principales en una y luego actualizar en cascada todas las relaciones afectadas? Aquí está el escenario:

Clientes (idCustomer int PK, Company varchar (50), etc)

CustomerContacts (idCustomerContact int PK, idCustomer int FK, nombre varchar (50), etc.)

Notas del cliente (idCustomerNote int PK, idCustomer int FK, texto de la nota, etc.)

A veces los clientes deben fusionarse en uno solo. Por ejemplo, tiene un cliente con el ID de 1 y otro con el ID de 2. Desea combinar ambos, de modo que todo lo que era 2 ahora es 1. Sé que podría escribir un script que actualice todas las tablas afectadas uno por uno, pero me gustaría que sea más seguro en el futuro mediante el uso de las reglas en cascada, por lo que no tengo que actualizar el script cada vez que se agregue una nueva relación.

¿Alguna idea?

¿Fue útil?

Solución

No hay una forma automática de hacerlo, pero tiene un par de opciones, puede escribir los procedimientos manualmente, o puede generar la fusión del código de forma regular o generarlo dinámicamente en tiempo de ejecución. Para hacer esto, puede utilizar el INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS y INFORMATION_SCHEMA.KEY_COLUMN_USAGE y INFORMATION_SCHEMA.TABLE_CONSTRAINTS y INFORMATION_SCHEMA.COLUMNSNS y. TABLAS para construir el procedimiento dinámicamente.

También puede simplemente envolver toda la operación en una transacción (una buena idea de todos modos). El último paso será eliminar al cliente del que se está fusionando, por lo que si no hay RI en una tabla que nunca agregó e intenta hacer una fusión, fallará porque no puede eliminar al cliente que se está fusionando ya que hay dependientes registros en una tabla que no se ha agregado al procedimiento de combinación.

Otros consejos

Considera usar Triggers en su lugar. Al actualizar los Clientes (columna idCustomer), usted realiza las modificaciones necesarias (Eliminar, Actualizar ...) en las tablas relacionadas.

Parece que terminará con dos registros para cada una de estas tablas que tienen la misma clave principal. ¿Es esta tu intención?

        Customers
    idCustomer Company
         1     AT&T
         2     Cingular

Después de la fusión se convertirá

        Customers
    idCustomer Company
         1     AT&T
         1     Cingular

En cualquier caso, la solución de prueba más futura sería escribir un procedimiento. Podría pasar el procedimiento a ambos clientes y haría todo el trabajo de actualizar todas las tablas según sea necesario.

¿Alguna solución más reciente a esto?

Tengo el mismo problema y, en este momento, construir los procedimientos de forma dinámica parece demasiado complicado. Aquí es cómo podría funcionar en teoría, pero supongo que no?

En una transacción: 1) Deshabilite temporalmente la restricción de la clave principal en los clientes 2) Actualice la ID primaria de Cingular a '1' que tiene una regla de cascada de actualización de relaciones que cuida a los niños 3) Utilice un campo de clave secundaria para eliminar (solo) Cingular 4) Habilitar la restricción de clave principal en los clientes

Esperando algo como esto en el futuro T-SQL:

BORRAR CON ACTUALIZACIÓN idCustomer = 1 DE LOS CLIENTES DONDE idCustomer = 2;

;-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top