Попытка вставить в таблицу после появления ошибки приложения, но ее откаты

#database #oracle #plsql #oracle11g #triggers

Вопрос:

Я пытаюсь создать триггер, чтобы ограничить пользователя выполнением DDL в субботу и воскресенье, но если кто-то попытается вставить данные, это сохранит их в weekend_action таблице, но также вызовет ошибку приложения, которое не может выполнить DDL.

SQL-ЗАПРОС:

 create or replace trigger tgr_wkd_action before insert on tbl_39_dept_k  for each row declare begin  IF trim(TO_CHAR(sysdate,'Day')) IN ('Tuesday', 'Sunday') then   RAISE_APPLICATION_ERROR (-20000,'you cannot perform DDL on Weekend');  end if;    if inserting then  insert into user_admin.weekend_actions values   (:NEW.Dept_no,  'updation',  'user'||user||'trying to insert data on'||'_'||sysdate||'from Table tbl_39_dept_k');  end if; end tgr_wkd_action;  

Комментарии:

1. Ваш код таков IF tue/sun THEN raise error ELSE log error . Это то, чего ты хочешь? Или вы хотите записать запись в журнале только во вторник/вс, а не во вторник/вс? Или даже независимо от дня? Помните, что RAISE_APPLICATION_ERROR это завершает сценарий; как только вы выдадите ошибку, вы не будете выполнять следующие строки.

2. нет, нет, я просто поставил это, потому что проверял … сегодня вторник, вот почему

3. я хочу вызвать ошибку приложения, а также получить запись в журнале

4. Затем переместите оператор insert перед оператором raise.

5. нет, его досент работает, даже если я переместил его до инструкции raise, потому что откаты инструкции raise

Ответ №1:

если кто-то попытается вставить данные

Точно. Вставить.

Ваш триггер срабатывает перед обновлением, и это другой DML.


Помимо этого:

  • вставки и обновления-это DML (манипуляция данными). DDL, о котором вы упомянули, — это определение данных (это создание таблицы, изменение таблицы,…)
  • акция выходного дня против вторника? С каких это пор вторник-выходной?

Возможно, вы имели в виду

 SQLgt; CREATE OR REPLACE TRIGGER tgr_wkd_action  2 BEFORE INSERT OR UPDATE  3 ON tbl_39_dept_k  4 FOR EACH ROW  5 DECLARE  6 BEGIN  7 IF TRIM (TO_CHAR (SYSDATE, 'Day', 'nls_date_language = english')) IN  8 ('Saturday', 'Sunday')  9 THEN  10 RAISE_APPLICATION_ERROR (-20000, 'you cannot perform DML on Weekend');  11 END IF;  12  13 IF INSERTING  14 THEN  15 INSERT INTO weekend_actions  16 VALUES (  17 :NEW.Dept_no,  18 'inserting',  19 'user'  20 || USER  21 || 'trying to insert data on'  22 || '_'  23 || SYSDATE  24 || 'from Table tbl_39_dept_k');  25 ELSIF UPDATING  26 THEN  27 INSERT INTO weekend_actions  28 VALUES (  29 :NEW.Dept_no,  30 'updating',  31 'user'  32 || USER  33 || 'trying to update data on'  34 || '_'  35 || SYSDATE  36 || 'from Table tbl_39_dept_k');  37 END IF;  38 END tgr_wkd_action;  39 /  Trigger created.  SQLgt; SQLgt; INSERT INTO tbl_39_dept_k (dept_no) VALUES (10);  1 row created.  SQLgt;  

Содержание таблиц:

 SQLgt; select * from tbl_39_dept_k;   DEPT_NO ----------  10  SQLgt; select * from weekend_actions;   DEPT_NO ACTION MSG ---------- ---------- ----------------------------------------------------------------------  10 inserting userSCOTTtrying to insert data on_23.11.21from Table tbl_39_dept_k  SQLgt;  

Притворяясь, что сегодня выходные (в то время как сегодня вторник):

 lt;snipgt;  7 IF TRIM (TO_CHAR (SYSDATE, 'Day', 'nls_date_language = english')) IN  8 ('Tuesday', 'Sunday')  9 THEN lt;snipgt;  39 /  Trigger created.  SQLgt; SQLgt; INSERT INTO tbl_39_dept_k (dept_no) VALUES (20); INSERT INTO tbl_39_dept_k (dept_no) VALUES (20)  * ERROR at line 1: ORA-20000: you cannot perform DML on Weekend ORA-06512: at "SCOTT.TGR_WKD_ACTION", line 6 ORA-04088: error during execution of trigger 'SCOTT.TGR_WKD_ACTION'   SQLgt;  

Комментарии:

1. будет ли это только вызывать ошибку или также вставляться в таблицу журнала

2. ваш код в порядке, но у меня все еще та же проблема, она вызывает ошибку, но не вставляет значение в таблицу журнала

3. Правильно, мой код в порядке. Я предлагаю вам настроить СВОЙ код так, чтобы он работал так же, как мой.

4. нет кода u в порядке, но он не делает то, в чем заключалась моя проблема ..на самом деле, мой код также отлично работает с тем же самым … Я хочу, чтобы триггер показывал исключение и вставку одновременно в субботу… каков ваш код, он показывает только исключение, но не выполняет вставку

5. Вы не можете создать исключение И разрешить вставку строки. Если вы поднимаете и исключаете, то это все — дальнейшая обработка не допускается (следовательно, вставка никогда не произойдет).