una tablas tabla relacionar referencial primarias primaria por llaves llave integridad foráneas foranea externa developer datos creada compuesta como codigo clave agregar sql sql-server sql-server-2005 foreign-keys linked-server

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

  1. 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.
  2. 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
  3. 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