oracle - segundo - no puedo dar permisos a aplicaciones
¿Me perderé los cambios si reemplazo un activador de Oracle mientras mi aplicación se está ejecutando? (3)
Me pregunto si perderé algún dato si reemplazo un disparador mientras mi base de datos Oracle está en uso. Creé un ejemplo de juguete y parece que no lo haré, pero uno de mis compañeros de trabajo afirma lo contrario.
create table test_trigger (id number);
create table test_trigger_h (id number);
create sequence test_trigger_seq;
--/
create or replace trigger test_trigger_t after insert on test_trigger for each row
begin
insert into test_trigger_h (id) values (:new.id);
end;
/
--/
begin
for i in 1..100000 loop
insert into test_trigger (id) values (test_trigger_seq.nextval);
end loop;
end;
/
--/
begin
for i in 1..10000 loop
execute immediate ''create or replace trigger test_trigger_t after insert on test_trigger for each row begin insert into test_trigger_h (id) values (:new.id); end;'';
end loop;
end;
/
ran the two loops at the same time
select count(1) from test_trigger;
COUNT(1)
100000
select count(1) from test_trigger_h;
COUNT(1)
100000
Creo que podrías estar probando esto de la manera incorrecta. Sus instrucciones de inserción no tardarán en absoluto y, por lo tanto, la sustitución del activador puede caber a través de los espacios entre las inserciones. Al menos esto es lo que infiero debido a lo siguiente.
Si cambia su prueba para asegurarse de tener una declaración SQL de larga ejecución, por ejemplo
create table test_trigger (id number);
create table test_trigger_h (id number);
create sequence test_trigger_seq;
create or replace trigger test_trigger_t
after insert on test_trigger for each row
begin
insert into test_trigger_h (id) values (:new.id);
end;
/
insert into test_trigger
select level
from dual
connect by level <= 1000000;
Si luego intenta reemplazar el activador en una sesión separada , esto no ocurrirá hasta que la inserción se haya completado.
Lamentablemente, no puedo encontrar nada en la documentación que me respalde; esto es solo un comportamiento del cual soy consciente.
create or replace
está bloqueando la mesa. Entonces todas las inserciones esperarán hasta que se complete. No te preocupes por las inserciones perdidas.
Las siguientes respuestas de URL que activan pueden modificarse mientras se ejecuta la aplicación . será un bloqueo de "caché de biblioteca" y NO un bloqueo de "datos". Oracle lo maneja internamente sin que te preocupes por eso.
Mira la pregunta planteada por Ben- ¿Se puede bloquear un disparador? ¿cómo uno determinaría que es?
- Ejecuta esto desde la sesión 2: selecciona * desde v $ acceso donde object = upper (''test_trigger_t'');