Tengo dos tablas en dos bases de datos diferentes. En table1 (en database1) hay una columna llamada column1 y es una clave primaria. Ahora en la tabla2 (en la base de datos2) hay una columna llamada columna2 y quiero agregarla como una clave externa.
Intenté agregarlo y me dio el siguiente error:
Msg 1763, nivel 16, estado 0, línea 1
No se admiten las referencias de clave externa entre bases de datos. Clave externa Database2.table2.Msg 1750, nivel 16, estado 0, línea 1
No se pudo crear restricción. Ver errores anteriores.
¿Cómo hago eso ya que las tablas están en diferentes bases de datos?
Si necesita una integridad sólida como una roca, tenga ambas tablas en una base de datos y use una restricción FK. Si su tabla principal está en otra base de datos, nada impide que alguien restaure esa base de datos principal a partir de una copia de seguridad anterior, y luego tiene huérfanos.
Esta es la razón por la que no se admite FK entre bases de datos.
fuente
En mi experiencia, la mejor manera de manejar esto cuando la principal fuente autorizada de información para dos tablas que están relacionadas tiene que estar en dos bases de datos separadas es sincronizar una copia de la tabla desde la ubicación principal a la ubicación secundaria (usando T- SQL o SSIS con la verificación de errores adecuada: no puede truncar y volver a llenar una tabla mientras tenga una referencia de clave externa, por lo que hay algunas formas de actualizar el gato en la tabla).
Luego agregue una relación FK tradicional en la segunda ubicación de la tabla, que es efectivamente una copia de solo lectura.
Puede utilizar un desencadenador o un trabajo programado en la ubicación principal para mantener la copia actualizada.
fuente
Puede usar la restricción de verificación con una función definida por el usuario para realizar la verificación. Es más confiable que un disparador. Se puede deshabilitar y volver a habilitar cuando sea necesario, al igual que las claves externas y volver a verificar después de una restauración de la base de datos2.
CREATE FUNCTION dbo.fn_db2_schema2_tb_A (@column1 INT) RETURNS BIT AS BEGIN DECLARE @exists bit = 0 IF EXISTS ( SELECT TOP 1 1 FROM DB2.SCHEMA2.tb_A WHERE COLUMN_KEY_1 = @COLUMN1 ) BEGIN SET @exists = 1 END; RETURN @exists END GO ALTER TABLE db1.schema1.tb_S ADD CONSTRAINT CHK_S_key_col1_in_db2_schema2_tb_A CHECK(dbo.fn_db2_schema2_tb_A(key_col1) = 1)
fuente
La respuesta corta es que SQL Server (a partir de SQL 2008) no admite claves externas de bases de datos cruzadas, como indica el mensaje de error.
Si bien no puede tener integridad referencial declarativa (FK), puede alcanzar el mismo objetivo utilizando disparadores. Es un poco menos confiable, porque la lógica que escribe puede tener errores, pero lo llevará allí de todos modos.
Consulte los documentos SQL en http://msdn.microsoft.com/en-us/library/aa258254%28v=sql.80%29.aspx Qué estado:
También hay una buena discusión en SQLTeam - http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=31135
fuente
Como dice el mensaje de error, esto no es compatible con el servidor SQL. La única forma de garantizar la integridad de referencia es trabajar con desencadenantes.
fuente