¿Relacionar 2tablas de BDs con Integridad?

Aquí te planteo otra duda que tengo sobre sql. Te agradecería que me respondieras cuando puedas. Me surgió el otro día y me dificulta el trabajo.
He leído que se pueden relacionar 2 tablas de distintas bases de datos de la siguiente manera :
select uno.campo1, dos.campo1
from basededatos1.tabla1 uno, basededatos2.tabla1 dos
where uno.campo1 = dos.campo1
Lo he probado y funciona muy bien. Me ha sido de gran ayuda, pero ...
Creo que no mantiene la integridad referencial.
¿Cómo hago para que exista integridad referencial entre 2 tablas de diferentes bases de datos?
He probado con el siguiente código :
Create table tt1
(Contador int,
texto nvarchar (30),
serie nvarchar (5)
FOREIGN KEY REFERENCES gestión.dbo.TT (serie))
GO
Intentando crear la tabla TT1 en la base
de datos Pruebas_Gest. El campo de esta nueva tabla quiero que sea clave foránea de la tabla TT de la base de datos Gestión.
El analizador de consultas me devuelve el siguiente mensaje :
Servidor: mensaje 1763, nivel 16, estado 1, línea 1
No se admiten referencias cruzadas de claves externas entre bases de datos. Clave externa 'gestión.dbo.TT'.
A ver si me puedes ayudar.
1

1 Respuesta

7.450 pts.
Disculpa por la tardanza pero estoy un poco liado con el trabajo. Es más me voy la semana que viene entera a Tec-ed en Barcelona. Si tienes alguna pregunta más te agradecería que las pusieses en el grupo de noticias en español de sql-server ya que no podré leer el correo en una semana desde fuera de mi oficina (la seguridad de la leche). Pero si leeré puntualmente las noticias :-)
Ahora la respuesta
Efectivamente, Sql-server no admite ese tipo de integridad. La DRI (integridad referencial declarativa funciona solamente con elementos de la misma B.D) incluso con Sql-server 2000. Pero este problema se puede solventar de otra forma, con Triggers, Te pongo un ejemplo de integridad referencial con triggers contra la tabla customers de northwind, que tenemos todos. El ejemplo no es completo, pero creo que a efectos didácticos es mejor no complicar la cosa. Lo que le falta es solamente un trigger en la tabla Customers de Northwind que impida que se borre un cliente de Northwind y te deje registros huérfanos en nuestra tabla.
Use pruebas
Go
create table IntegridadPorTriggers(id Int identity(1,1) not null Primary key,
CustomerId nvarchar(5) null)
Go
create trigger Trg_integridadPorTriggers on IntegridadPorTriggers
for insert, update
as
Declare @Cuantos int
Begin Tran
-- Seleccionamos los que se acaban de insertar que no existen
Select @Cuantos=Count(*)FRom Northwind.dbo.Customers C
right join inserted i on C.Customerid=i.customerid
where c.customerid is null
if @Cuantos>0
begin
rollback tran
raiserror ('No se puede insertar un registro que no tenga su correspondiente en la Tabla Customers de Northwind',16,1)
end
else
commit tran
go
insert into IntegridadPorTriggers values('ALFKI')
GO
insert into IntegridadPorTriggers values('ERROR')
GO
Espero que te sirva.
Un saludo
Miguel Egea
http://www22.brinkster.com/miguele

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas