update trigger tabla son sirven sentencia qué que parametros para misma los eventos disparadores crear con campo actualizar oracle triggers

tabla - trigger con parametros oracle



Disparador condicional (3)

No creo que pueda definir desencadenantes con comportamiento recursivo como este. La forma correcta de hacerlo es

create or replace trigger insert_test_id before insert on test -- note: it is "when", not "where" when(test.name=''Ash'') begin -- this is how you override a field from within the trigger :new.s_no := ''def''; end;

Sin embargo, esto solo insertará un registro, no dos, si ese fue su intento original.

create or replace trigger insert_test_id before insert on test where(test.name=''Ash'') begin insert into test(s_no) values(''def''); end

mi mesa es

ID de prueba entero nombre varchar2 (200) s_no varchar2 (250)

por favor dime que cuál es el error en este disparador. No soy capaz de averiguarlo.


Un vistazo rápido a la documentación en línea le hubiera dicho que la sintaxis condicional es WHEN no WHERE.

También debe hacer referencia a la columna con la palabra clave NEW en lugar del nombre de la tabla. Y como Gary señala acertadamente, solo podemos aplicar la cláusula condicional para los desencadenantes ROW LEVEL:

SQL> create or replace trigger insert_test_id 2 before insert on t23 3 for each row 4 when (new.name=''Ash'') 5 begin 6 insert into t23(name) values(''def''); 7 end; 8 / Trigger created. SQL> insert into t23 values (''abc'') 2 / 1 row created. SQL> select name from t23 2 / NAM --- abc 1 rows selected. SQL>

La condición también funciona ...

SQL> insert into t23 values (''Ash'') 2 / 1 row created. SQL> select name from t23 2 / NAM --- abc def Ash 3 rows selected. SQL>

Incluso funciona para múltiples filas ...

SQL> insert into t23 2 select txt from t42 3 / 4 rows created. SQL> select name from t23 2 / NAM --- abc def Ash XXX ZZZ ABC DEF 7 rows selected. SQL>

¿Entonces, cuál es el problema? Esta:

SQL> create or replace trigger insert_test_id 2 before insert on t23 3 for each row 4 when (new.name=''def'') 5 begin 6 insert into t23(name) values(''def''); 7 end; 8 / Trigger created. SQL> insert into t23 values (''def'') 2 / insert into t23 values (''def'') * ERROR at line 1: ORA-00036: maximum number of recursive SQL levels (50) exceeded ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger ''APC.INSERT_TEST_ID'' ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger ''APC.INSERT_TEST_ID'' ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger ''APC.INSERT_TEST_ID'' ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger ''APC.INSERT_TEST_ID'' ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger ''APC.INSERT_TEST_ID'' ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger ''APC.INSERT_TEST_ID'' ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger ''APC.INSERT_TEST_ID'' ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger ''APC.INSERT_TEST_ID'' ORA-06512: at "APC.INSERT_TEST_ID", line 2 ORA-04088: error during execution of trigger SQL>

Por supuesto que he hecho trampa aquí, para generar el error. Si tanto el valor de prueba como el valor sustituido están codificados de forma rígida, se puede evitar el problema. Pero si cualquiera de las dos es una búsqueda, entonces el riesgo de recurrencia está allí.

Si lo que realmente desea hacer es reemplazar un valor de entrada en lugar de insertar una fila adicional, debe usar la sintaxis de asignación simple publicada por @Lukas .


Prueba este entonces:

CREATE OR REPLACE TRIGGER insert_test_id BEFORE INSERT ON test WHEN(new.name=''Ash'') FOR EACH ROW BEGIN :new.s_no := ''def''; END;

El "PARA CADA FILA" lo convierte en un disparador de nivel de extracto, ejecutado para cada fila afectada por el inserto en la tabla. Eso debería deshacerse de la ora-04077