procedimientos - procedure oracle ejemplos
Oracle: disparador de incremento automático. (3)
Encontré el siguiente desencadenador en una base de datos que estaba bloqueando inserciones en una clave primaria varchar única
CREATE OR REPLACE TRIGGER "BI_PRIVILEGE"
before insert on "PRIVILEGE"
for each row
begin
if :NEW."PRIVILEGE-ID" is null then
select "PRIVILEGE_SEQ".nextval into :NEW."PRIVILEGE-ID" from dual;
end if;
end;
¿Es esto un generador automático de números? Puedo desactivarlo fácilmente para solucionar mi problema, pero ¿habrá ramificaciones imprevistas negativas para la clave principal?
De hecho, he estado buscando un código para configurar activadores de incremento automático para claves primarias y podría usar esto como una plantilla si esto es lo que está haciendo. Si es así, es probable que lo haga incorrectamente, ya que la clave primaria es PRIVILEGE_ID
particular PRIVILEGE_ID
PRIVILEGE-ID
, además, ¿no debería surgir algún tipo de application_error
en el caso de conflictos, etc.?
De acuerdo, creo que entiendo lo que está pasando. La respuesta a tu pregunta es un sí absolutamente masivo. Puede haber un gran impacto si deshabilita este desencadenador.
La razón por la cual este disparador parece existir es lidiar con la situación en la que no se proporciona un valor de clave principal en una inserción en su tabla. Si esto ocurre en cualquier lugar de su código, al quitar el gatillo se romperán esas inserciones.
Tienes que hacer dos cosas.
Corrija el disparador, obviamente está roto; arreglalo:
CREATE OR REPLACE TRIGGER BI_PRIVILEGE before insert on PRIVILEGE for each row begin if :NEW.PRIVILEGE_ID is null then select PRIVILEGE_SEQ.nextval into :NEW.PRIVILEGE_ID from dual; end if; end;
Si usa Oracle 11G o superior, puede usar esto en su lugar:
if :NEW.PRIVILEGE_ID is null then :NEW.PRIVILEGE_ID := PRIVILEGE_SEQ.nextval; end if;
Determine si esto realmente sucede. Si inserta registros sin una clave principal, debe averiguar por qué ocurre esto y si el comportamiento es correcto. Si es que estás atascado con el gatillo, de lo contrario arregla eso. Si nunca inserta registros sin una clave principal, puede desactivar el desencadenador.
La forma más rápida de averiguarlo es desactivar el activador de todos modos, pero rompería sus insertos. Si solo se trata de una base de datos de producción, puedes saber si vale la pena. Yo no lo haría personalmente
"en este caso, la clave primaria está destinada a cadenas únicas. No puedo imaginar que el autoincremento pueda ser totalmente útil en ese contexto".
Si te refieres a que "PRIVILEGE-ID" es una columna varchar2, entonces estás en cierto modo en lo cierto. Por un lado, un número también puede ser una cadena, por lo que funcionaría como una clave. Pero si se supone que la clave tiene un formato específico de letras y números, un número monótonamente creciente no se ajustará al patten.
Para mí, la preocupación sería esa declaración IF. Sugiere que, a veces, la aplicación rellena la clave y, en otros momentos, la base de datos la incumple. Eso es desordenado Aparte de todo lo demás, tener dos fuentes de claves significa que ya no se garantiza que la secuencia sea única. Ahora tiene la posibilidad de que la secuencia generada nextval
colisione con un número anterior asignado manualmente.
¿Qué hacer?
Si tiene un entorno de desarrollo con buena cobertura de unidades unitarias o pruebas de integración, la respuesta es simple: deshabilite el activador, ejecute sus suites de prueba y vea qué falla. Si eso no describe su configuración (y tengo la sensación de que no), deshabilitar ese disparador es más arriesgado, porque no puede confiar en que ha probado todas las rutas que pueblan la tabla.
Este script obtendrá un valor de una secuencia y lo colocará en una fila recién insertada en la tabla. Está actuando muy similar a un autonumber. Supongo que el código de la aplicación se basa en este desencadenador para completar la clave principal para las filas insertadas, no recomendaría su eliminación antes de evaluar el código fuente de una aplicación.
A menos que esto haya sido algo olvidado sobre el experimento, es probable que el código de la aplicación dependa de este disparador / secuencia.
Esta es una solución aceptable para la funcionalidad autoincrement. Ver: ¿Cómo crear ID con AUTO_INCREMENT en Oracle?