Как узнать имя сотрудника при получении заработной платы? - PullRequest
1 голос
/ 14 марта 2019
create or replace trigger trg_t3 after  
    insert OR update or delete of salary  on t2 
    for each row  
begin 
   if 
    to_char(systimestamp,'hh24') not between 9 and 17 
   then 
    insert into  t3  values (:new.salary, :old.salary, sysdate);
   else
     DBMS_OUTPUT.put_line ('update is not possible  between 9:00 and 17:00');
   end if;        
end; 
/

это будет включать старую зарплату, новую зарплату и время в таблице t3 в зависимости от условий, указанных в триггере в таблице t2. Но мне нужно имя сотрудника, чья зарплата обновлена ​​или удалена.

если я обновляю зарплату на t2, мне нужно указать имя конкретного сотрудника, зарплату которого я изменил, в t3. Но текущий метод будет включать только старую зарплату, новую зарплату и время

вот код для создания таблиц

create table t2 ( name varchar(20), salary varchar2(20));
create table t3 (salary_new   varchar2(50), salary_old  varchar2(20), log_date date);

insert all 
into t2 values('hari',2000) 
into t2 values('sam',40000)
into t2 values('ravi',60000)
into t2 values('manoj',8000)
into t2 values('pratheep',10000)
into t2 values('john',3000)
into t2 values('joe',50000)
into t2 values('scott',70000)
select * from dual;

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Ваш триггер помечен как after insert or update or delete. Вы должны обработать все три ситуации, иначе это не будет работать правильно, потому что при вставке у нас нет значений :old, а при удалении нет :new.

Так что если вы используете :new.name, то delete установит нулевое значение. Если вы используете :old.name, то insert не будет работать правильно. Используйте переменную или сделайте как здесь:

create or replace trigger trg_t3 after
  insert or update or delete of salary on t2 for each row
begin
  if to_char(systimestamp,'hh24') between 9 and 17 then
    dbms_output.put_line ('update is not possible between 9:00 and 17:00');
  else
    if deleting then
      insert into t3 (salary_new, salary_old, name, log_date)
        values (null, :old.salary, :old.name, sysdate);
    elsif inserting then
      insert into t3 (salary_new, salary_old, name, log_date)
        values (:new.salary, null, :new.name, sysdate);
    elsif updating then
      insert into t3 (salary_new, salary_old, name, log_date)
        values (:new.salary, :old.salary, :new.name, sysdate);
    end if;
  end if;
end;
1 голос
/ 14 марта 2019

сначала вам нужно поле для вставки имени, поэтому создайте t3 как

create table t3 (salary_new   varchar2(50), salary_old  varchar2(20), log_date date, name varchar(20));

, затем в вашем триггере просто используйте

insert into  t3  values (:new.salary, :old.salary, sysdate, :new.name);

, вы можете использовать либо: new.name или: old.name, поскольку оно не меняется, поэтому будет иметь то же значение.

1 голос
/ 14 марта 2019

Выберите вставку

insert into  t3  
select emp.name, :new.salary, :old.salary, sysdate
from emp where emp.id = :old.id;
...