2 votos

Editar la vista de la tabla de la versión por defecto usando SQL Server

Tengo una base de datos geográfica de ArcSDE (10.3) que está versionada, ya que tenemos varias personas trabajando simultáneamente en los datos. Sin embargo, quiero ejecutar algunos scripts de fondo en SQL Server para actualizar la versión por defecto cuando nadie está trabajando en los datos.

De todos modos, los datos que voy a editar son en realidad una clase de características. No voy a hacer ningún cambio de geometría, sino que sólo voy a cambiar algunos valores de atributos. Sin embargo, este cambio de atributos se basa en una unión a otra tabla SDE que reside dentro de la misma base de datos.

ESRI indica que los cambios realizados desde SQL Server deben hacerse en la tabla VIEW y no en la tabla base real. Sin embargo, cuando ejecuto mi script, me da este error:

Msg 414, Level 16, State 1, Line 6
UPDATE is not allowed because the statement updates view "dbo.MyTable_evw" which participates in a join and has an INSTEAD OF UPDATE trigger.

¿Cómo han sorteado otras personas este problema?

Ejemplo de declaración de actualización que está lanzando el error mencionado anteriormente.

BEGIN TRANSACTION
EXEC set_default

UPDATE [dbo].[MyFeatureClass_evw]
SET [dbo].[MyFeatureClass_evw].[Status] = [dbo].[MySDEDataTable].[Status_2],

FROM [dbo].[MyFeatureClass_evw] INNER JOIN
[dbo].[MySDEDataTable] ON [dbo].[MyFeatureClass_evw].[PrimaryKey] = [dbo].[MySDEDataTable].[PrimeKey]

COMMIT;

El método de @MickyT funciona muy bien. Además, cabe mencionar que también conseguí que el comando MERGE hiciera esta operación también.

MERGE MyFeatureClass_evw as TargetTable
USING MySDEDataTable as SourceTable
ON TargetTable.PrimaryKey = SourceTable.PrimeKey
WHEN MATCHED THEN
  UPDATE SET TargetTable.Status = SourceTable.Status_2
;

2voto

jennz0r Puntos 48

Este parece ser un problema de SQL Server desde hace algún tiempo. No sé por qué no lo permiten. Si cambias tu declaración de actualización a algo como esto, debería funcionar.

UPDATE [dbo].[MyFeatureClass_evw]
SET [dbo].[MyFeatureClass_evw].[Status] = (
    SELECT A.[Status_2] 
    FROM [dbo].[MySDEDataTable] AS A 
    WHERE [dbo].[MyFeatureClass_evw].[PrimaryKey] = A.[PrimeKey]
    ),
    [dbo].[MyFeatureClass_evw].[Value] = (
    SELECT A.[Value_2] 
    FROM [dbo].[MySDEDataTable] AS A 
    WHERE [dbo].[MyFeatureClass_evw].[PrimaryKey] = A.[PrimeKey]
    )
WHERE EXISTS (
    SELECT 1 
    FROM [dbo].[MySDEDataTable] AS A1 
    WHERE [dbo].[MyFeatureClass_evw].[PrimaryKey] = A1.[PrimeKey]
    )

Puede resultar un poco farragoso con la repetición de las consultas SELECT para cada columna actualizada, pero funciona.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X