트리거 용 SQL 스크립트가 있습니다. 이것은 "Win'Design"이라는 데이터베이스 모델링을위한 훌륭한 소프트웨어에 의해 자동으로 생성되었습니다.PostgreSQL에 트리거 스크립트 작성 중 오류가 발생했습니다.
그래서 모든 테이블 (0 데이터)이있는 데이터베이스를 만든 후 pgAdmin 쿼리 편집기에서 스크립트를 복사/붙여 넣기하고 싶습니다. 여기
은 추출물의 :-- Trigger de modification ----------------------------------------------
CREATE TRIGGER TU_SOURCE_OPEN_DATA
AFTER UPDATE ON SOURCE_OPEN_DATA FOR EACH ROW
EXECUTE PROCEDURE
-- Interdire la modification de la clé étrangère référençant la table
-- SOURCE_PARAMETRE.
if
:OLD.ID_SOURCE_PARAMETRE <> :NEW.ID_SOURCE_PARAMETRE
then
raise_application_error(
-20008,
'Modification de la clé étrangère référençant "SOURCE_PARAMETRE" interdite.');
end if;
/
DROP TRIGGER TI_SOURCE_OPEN_DATA;
-- Trigger d'insertion ----------------------------------------------
CREATE TRIGGER TI_SOURCE_OPEN_DATA
AFTER INSERT ON SOURCE_OPEN_DATA FOR EACH ROW
EXECUTE PROCEDURE
-- Sauf valeur nulle autorisée, interdire la création d'une occurrence de SOURCE_OPEN_DATA
-- s'il n'existe pas d'occurrence correspondante dans la table SOURCE_PARAMETRE.
select count(*) into numrows
from SOURCE_PARAMETRE
where
:NEW.ID_SOURCE_PARAMETRE = SOURCE_PARAMETRE.ID_SOURCE_PARAMETRE;
if
(
numrows = 0
)
then
raise_application_error(
-20002,
'Impossible d''ajouter "SOURCE_OPEN_DATA" car "SOURCE_PARAMETRE" n''existe pas.');
end if;
/
-- -------------------------------------------------------------------------------
-- Table : SECTEUR
-- -------------------------------------------------------------------------------
DROP TRIGGER TD_SECTEUR;
-- Trigger de suppression ----------------------------------------------
CREATE TRIGGER TD_SECTEUR
AFTER DELETE ON SECTEUR FOR EACH ROW
EXECUTE PROCEDURE
-- Supprimer les occurrences correspondantes de la table INTERESSE.
delete from INTERESSE
where
INTERESSE.ID_SECTEUR = :OLD.ID_SECTEUR;
/
여기에 메시지 오류입니다 :
ERROR: syntax error at or near ":"
LINE 9: :OLD.ID_SOURCE_PARAMETRE <> :NEW.ID_SOURCE_PARAMET...
^
********** Error **********
ERROR: syntax error at or near ":"
SQL state: 42601
Character: 304
내가 "트리거 디부 삽입"될 때까지 삭제 시도하고 여전히 오류가 발생했습니다
ERROR: syntax error at or near "select"
LINE 9: select count(*) into numrows
^
********** Error **********
ERROR: syntax error at or near "select"
SQL state: 42601
Character: 369
트리거를 사용한 첫 번째 ... 도와주세요
편집 : @Laurenz Albe와 @pozs가 정확하게 지적했듯이, 그것은 오라클 구문입니다. 이것은 PostgreSQL을 추출하는 동안 지정된대로 이상합니다. 그래서 내가 다른 Postgre9.1으로 시도하고이 스크립트를 생성 :
-
-------------------------------------------------------------------------------
-- Table : SOURCE_OPEN_DATA
-- -------------------------------------------------------------------------------
DROP TRIGGER TU_SOURCE_OPEN_DATA;
-- TRIGGER DE MODIFICATION --------------------------------
CREATE TRIGGER TU_SOURCE_OPEN_DATA
AFTER UPDATE ON SOURCE_OPEN_DATA
REFERENCING OLDROW, NEWROW
FOR EACH ROW
IMPORT
import java.sql.* ;
BEGIN
-- Interdire la modification de la clé étrangère référençant la table
-- SOURCE_PARAMETRE.
if
OLDROW.getValue(10, CHAR);.ID_SOURCE_PARAMETRE <> NEWROW.getValue(10, CHAR);.ID_SOURCE_PARAMETRE
then
raise_application_error(
-20008,
'Modification de la clé étrangère référençant "SOURCE_PARAMETRE" interdite.');
end if;
END;
DROP TRIGGER TI_SOURCE_OPEN_DATA;
-- TRIGGER D'INSERTION --------------------------------------
CREATE TRIGGER TI_SOURCE_OPEN_DATA
AFTER INSERT ON SOURCE_OPEN_DATA
REFERENCING OLDROW, NEWROW
FOR EACH ROW
IMPORT
import java.sql.* ;
BEGIN
END;
을 다시 말하지만, 이것은 단지 추출물이다. 이제받을 수 있습니다.
오라클 구문을 사용할 수 없습니다. [트리거 기능] (https://www.postgresql.org/docs/current/static/plpgsql-trigger.html) ('RETURNS trigger')을 만들고 [CREATE TRIGGER] (https :// /postgresql.org/docs/current/static/sql-createtrigger.html). –
이것은 PostgreSQL에 유효한 구문이 아닙니다. 'raise_application_error' 함수 호출에서 오라클을 위해 생성 될 수있는 것 같습니다. 가능한 경우 PostgreSQL 용 스크립트를 생성하십시오. – pozs
'... 인터럽트 발생시 SOURCE_OPEN_DATA -'SOURCE_PARAMETRE' 외래 키 제약 조건을위한 것입니다. – joop