#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. Вы не можете создать исключение И разрешить вставку строки. Если вы поднимаете и исключаете, то это все — дальнейшая обработка не допускается (следовательно, вставка никогда не произойдет).