Триггер с запросом текущей даты / предложением where - PullRequest
2 голосов
/ 24 ноября 2011

мы хотим создать триггер, который проверяет, находится ли новая точка измерения (= Messung) в пределах текущей формы ледника (= Umriss).

- таблицы выглядят следующим образом:

форма ледника (= Умрисс)

create table umriss
(
 umr_nr       number (4) not null,
 umr_datum    date,
 GLST_ID      number (4) not null,
 shape        mdsys.sdo_geometry,
 GLETSCHER_ID number (3) not null
)
;

alter table umriss
add constraint umriss_glst_pk
primary key (umr_nr, GLST_ID, GLETSCHER_ID)
;

ALTER TABLE umriss 
ADD CONSTRAINT umriss_gletscherstand_fk 
FOREIGN KEY (GLST_ID, GLETSCHER_ID) 
REFERENCES GLETSCHERSTAND(GLST_ID, GLETSCHER_ID);

новое измерение (= Messung)

CREATE TABLE MESSUNG
(
 MESS_NR      number (4) not null,
 MESS_DAT     date,
 MESS_AKK     number (20) NOT NULL,
 MESS_SCHMELZ number (20) NOT  NULL,
 SHAPE        mdsys.sdo_geometry,
 MESS_BILD    blob,  
 KMPGN_NR     NUMBER (4) NOT NULL
);

ALTER TABLE MESSUNG
ADD CONSTRAINT messung_pk
PRIMARY KEY (MESS_NR);

ALTER TABLE MESSUNG
ADD CONSTRAINT messung_messkampagne_fk
FOREIGN KEY (KMPGN_NR)
REFERENCES MESSKAMPAGNE(KMPGN_NR);

Триггер

CREATE OR REPLACE 
TRIGGER MESSUNG_in_UMRISS_TRI
BEFORE INSERT OR UPDATE ON MESSUNG
FOR EACH ROW
DECLARE 
   num_check NUMBER;
BEGIN 
   SELECT COUNT (*) INTO num_check
     FROM UMRISS u
    WHERE mdsys.sdo_contains (u.shape, :NEW.point) = 'TRUE';

   IF num_check <> 1
   THEN 
      RAISE_APPLICATION_ERROR (=20500, 'Messung in keinem Umriss')
   END IF; 
END; 

Как мы реализуем функцию, чтобы триггер проверял только в пределах самой фигурной формы ледника?Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

кажется, что POINT не определен в вашем примере?

Однако вы можете рассмотреть ограничение проверки, потому что триггер будет применяться только при вставке или обновлении записи MESSUNG, но не при изменении UMRISS

alter table MESSUNG add constraint MESSUNG_CC_CONTAINS check(mdsys.sdo_contains (shape, point) = 'TRUE')

В случае, если вы часто обновляете записи UMRISS, может быть нецелесообразно применять такое ограничение, поскольку Oracle придется проверять все записи MESSUNG при обновлении или удалении UMRISS. Возможно, рассмотрите дополнительную таблицу сопоставления между MESSUNG и UMRISS, которую вы можете обновить отдельно.

0 голосов
/ 24 ноября 2011

Это вернет одну строку из UMRISS, которая соответствует самой последней дате в таблице.

SELECT COUNT (*) INTO num_check
FROM UMRISS u
WHERE mdsys.sdo_contains (u.shape, :NEW.point) = 'TRUE'
AND u.umr_datum = ( select max(d.;umr_datum) from UMRISS d );

Этот тип запроса является ценой для хранения исторических данных в той же таблице, что и текущая запись.

...