4 votos

Forzar a Arcmap a respetar las restricciones / desencadenantes de clave principal

Tenemos una clase de entidad que tiene una restricción de clave principal(no OBJECTID) en la tabla de base de datos. Este campo también tiene un auto incremento trigger (ANTES de la INSERCIÓN)

Cuando nuestros usuarios intentan crear/agregar características a esta clase utilizando arcmap, ya que no se aceptan valores null número de campo, ArcMap añade un valor predeterminado (0), por lo que la segunda vez que intenta poner 0, viola la pk de la restricción. No sólo eso, sino que sobrescribe el ANTES de desencadenador de INSERCIÓN poniendo a 0 después de que se dispara.

No he sido capaz de solucionar este incluso con índices.

Una idea que pensé que podría trabajar estaba haciendo un DESPUÉS de INSERTAR el incremento de gatillo, o un desencadenador de ACTUALIZACIÓN que sólo funciona si los valores de pk es 0, pero no estoy seguro de cómo hacer ninguno de estos, o si eso es aún posible/necesario.

3voto

Anthony Cramp Puntos 126

Como se ha Mencionado por Vince, el problema es que hay dos modelos que están en conflicto.

Si usted tiene algún tipo de restricciones, ArcGIS, por defecto, no se sabe de ella. ArcGIS se supone que este es un estándar featureclass, y seguirá su propio modelo. Si desea ArcGIS para seguir su modelo, usted necesita para personalizar ArcGIS así que sigue este modelo. Lamentablemente esto no se puede hacer a través de la interfaz gráfica de usuario

Esto se hace generalmente por una Clase Personalizada de Extensión. Esto requerirá de personalización a través de ArcObjects.

Aquí están algunas muestras de la Clase de Extensiones: https://github.com/esri/arcobjects-sdk-community-samples/tree/master/Net/Geodatabase/TimestampClassExtension

https://github.com/esri/arcobjects-sdk-community-samples/tree/master/Net/Controls/EditingTabbedFeatureInspector

2voto

Hilary Puntos 6

Yo no estoy seguro de entender completamente lo que usted dice. Pero la siguiente es definitivamente malo:

No sólo eso, sino que sobrescribe el ANTES de desencadenador de INSERCIÓN poniendo a 0 después de que se dispara.

Nada puede alterar el valor de una columna una vez que la instrucción insert ha sido enviado a la base de datos para su ejecución. Cuando eso sucede, los siguientes eventos que tienen lugar en la secuencia:

  1. Todos los desencadenadores se ejecutan ANTES de
  2. La fila se inserta en la tabla
  3. Todos los índices se actualizan
  4. La integridad referencial (y otros) restricciones se comprueban
  5. Todos los desencadenadores AFTER ejecutar

Aquí es un ejemplo. Primero se crea una tabla y una secuencia

create table t1 (
  id number primary key,
  name varchar2(30)
);

create sequence t1_s;

Ahora definir el gatillo:

create or replace trigger t1_bi
before insert on t1
for each row
declare
begin
  if :new.id is null or :new.id = 0 then
    :new.id := t1_s.nextval();
  end if;
end;
/
show errors

Pruebe con un par de inserciones

insert into t1 values (0,'A');
insert into t1 values (0,'B');
insert into t1 values (0,'C');
insert into t1 values (0,'D');
commit;

Comprobar los resultados

SQL> select * from t1;

        ID NAME
---------- ----------
         1 A
         2 B
         3 C
         4 D

4 rows selected.

Porque el gatillo sólo reemplaza el valor de ID cuando la entrada no es 0 y no es null, el siguiente

insert into t1 values (42,'E');

conserva el valor dado:

SQL> select * from t1;

        ID NAME
---------- ----------
         1 A
         2 B
         3 C
         4 D
        42 E

5 rows selected.

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