Один триггер для чтения из двух таблиц

Можно ли использовать две таблицы в одном триггере? У меня есть таблица истории, в которой мне нужно разместить данные из двух таблиц.

IE.

Guest (Guestno, firstname,lastname,address,city, state, zip.....)
Booking (BookingId, Hotelno, Guestno, datefrom, datefrom)
Boogking history (bookingid,guestno, fristname,lastname, address, city, state, zip, hotelno, datefrom, dateto)

Итак, триггер, который я хочу создать, заключается в том, что всякий раз, когда в таблице бронирования обновляется datefrom, он должен обновлять всю информацию в таблице booking_history (кроме dateto .... в случае, если dateto не введено)

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

CREATE OR REPLACE TRIGGER BOOKING_DATETO_UPDATE
AFTER UPDATE OF DATETO ON BOOKING
FOR EACH ROW
BEGIN 


INSERT INTO BOOKINGHISTORY
(BOOKINGID, GUETNO, FIRSTNAME, LASTNAME, ADDRESS, CITY, STATE, ZIP, HOTELNO, DATETO, DATFROM)

VALUES (:OLD.bookingid,:OLD.guestno, :OLD.FirstName, :OLD.LastName,
:OLD.Address, :OLD.City, :OLD.State, :OLD.Zip, :OLD,Hotelno, :OLD.Dateto, :OLD.Datefrom);


end;

ошибка, которую я получаю, находится ниже. Ниже приведен образец, но все поля из таблицы Guest (guestno, firstname, lastname, ADDRESS, CITY, STATE)

Ошибка (9,38): PLS-00049: неверная привязка переменной 'OLD.FIRSTNAME'


person user1672735    schedule 17.09.2012    source источник
comment
пожалуйста, покажите нам настоящее (точное) сообщение об ошибке.   -  person a_horse_with_no_name    schedule 17.09.2012


Ответы (2)


Прежде всего, объясните, когда триггер выдает ошибку и точный текст ошибки. Как я мог видеть, триггер неверен: 1. ЕСЛИ ОБНОВЛЕНИЕ - проблема с заклинанием + я не понимаю, почему вы его используете, если триггер объявлен как ВКЛЮЧЕНО ОБНОВЛЕНИЕ 2. Если вы хотите проверить: OLD.DATETO, изменилось ли просто сравните это с: новым идентификатором. 3. после IF должно быть ТОГДА

Попробуйте добавить эти исправления и показать текст ошибки

Триггер для таблицы BOOKING может работать с полями, которые существуют в таблице BOOKING. Вы пытаетесь работать со старыми / новыми полями таблицы GUEST, что НЕВОЗМОЖНО. старый и новый GUEST могут быть доступны только в триггере таблицы GUEST. Вот и все.

person Alexander Tokarev    schedule 17.09.2012
comment
1.) Я удалил часть, в которой написано ЕСЛИ ОБНОВЛЕНИЕ ..... Я понимаю, что вы говорите 2.) Я все еще получаю эту ошибку компиляции. ниже приведен образец .... но все поля из гостевой таблицы имеют ту же проблему. Ошибка (9,38): PLS-00049: неверная привязка переменной 'OLD.FIRSTNAME' - person user1672735; 17.09.2012
comment
Обновляю свой ответ. Видеть это. В двух словах - невозможно делать то, что вы пытаетесь достичь. - person Alexander Tokarev; 17.09.2012

Триггер, безусловно, может запрашивать таблицу, отличную от таблицы, для которой он определен (хотя включение такого рода логики в триггеры делает весьма вероятным, что вы собираетесь вернуться и спросить, как обойтись без изменения исключений таблицы в будущем. ).

CREATE OR REPLACE TRIGGER BOOKING_DATETO_UPDATE
  AFTER UPDATE OF DATETO ON BOOKING
  FOR EACH ROW
DECLARE
  l_guest_rec guest%rowtype;
BEGIN 
  -- If `guestno` can change, you'll need to tell us whether you want to use the old or the 
  -- new `guestno` to look up the appropriate row in the `guest` table.
  SELECT *
    INTO l_guest_rec
    FROM guest
   WHERE guestno = :old.guestno;

  INSERT INTO BOOKINGHISTORY( BOOKINGID, 
                              GUESTNO, 
                              FIRSTNAME, 
                              LASTNAME, 
                              ADDRESS, 
                              CITY, 
                              STATE, 
                              ZIP, 
                              HOTELNO, 
                              DATETO, 
                              DATFROM)
   VALUES (:OLD.bookingid,
           :OLD.guestno, 
           l_guest_rec.FirstName, 
           l_guest_rec.LastName,
           l_guest_rec.Address, 
           l_guest_rec.City, 
           l_guest_rec.State, 
           l_guest_rec.Zip, 
           :OLD,Hotelno, 
           :OLD.Dateto, 
           :OLD.Datefrom);
end;
person Justin Cave    schedule 17.09.2012