tablas - ¿Puede tener una clave externa en la vista de una tabla de servidor vinculado en SQLServer 2k5?
relacionar tablas en sql server por codigo (3)
Tengo un SQLServer con un servidor vinculado en otra base de datos en otro lugar. He creado una vista en ese servidor vinculado
create view vw_foo as
select
[id],
[name]
from LINKEDSERVER.RemoteDatabase.dbo.tbl_bar
Me gustaría hacer lo siguiente
alter table [baz]
add foo_id int not null
go
alter table [baz] with check
add constraint [fk1_baz_to_foo]
foreign key([foo_id])
references [dbo].[vw_foo] ([id])
go
Pero eso genera el error: "La clave externa ''fk1_baz_to_foo'' hace referencia al objeto ''dbo.vw_foo'' que no es una tabla de usuario."
Si intento poner la clave externa directamente sobre la mesa usando el siguiente
alter table [baz] with check
add constraint [fk1_baz_to_bar]
foreign key([foo_id])
references LINKEDSERVER.RemoteDatabase.dbo.tbl_bar ([id])
Entonces me sale el siguiente error:
El nombre del objeto ''LINKEDSERVER.RemoteDatabase.dbo.tbl_bar'' contiene más que el número máximo de prefijos. El máximo es 2.
¿Hay alguna forma en que pueda lograr el mismo efecto?
Las claves externas no se pueden conectar a objetos no locales; deben hacer referencia a tablas locales. Obtiene el error de "número máximo de prefijos" porque hace referencia a la tabla con un nombre de 4 partes (LinkedServer.Database.Schema.Object) y un objeto local solo tiene un nombre de tres partes.
Otras soluciones
- Replica los datos del origen (la ubicación de la vista) en el mismo servidor que la tabla en la que intentas agregar la clave. Puede hacer esto cada hora, diariamente o lo que sea, según la frecuencia con la que cambien los datos de origen.
- Agregue un desencadenador en la tabla de origen para enviar cualquier cambio a su copia local. Esto sería esencialmente lo mismo que # 1, pero con una población inmediata de cambios
- Agregue un desencadenador EN LUGAR DE "a su tabla que verifique manualmente la restricción de clave externa seleccionando desde el servidor vinculado y comparando el valor que está tratando de INSERTAR / ACTUALIZAR. Si no coincide, puede rechazar el cambio.
No, las claves externas deben hacerse contra tablas de usuario. ¿Has probado el de abajo?
alter table [baz] with check
add constraint [fk1_baz_to_foo]
FOREIGN KEY([foo_id])
references
LINKEDSERVER.RemoteDatabase.dbo.tbl_bar([id])
go
Puedes hacerlo, pero debes usar algunos trucos dinámicos de SQL para que esto ocurra.
declare @cmd VARCHAR(4000)
SET @cmd = ''Use YourDatabase
ALTER TABLE YourTable
DROP CONSTRAINT YourConstraint''
exec YourServer.master.dbo.sp_executesql @SQL