2017-02-07 5 views
0

트리거 용 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; 

을 다시 말하지만, 이것은 단지 추출물이다. 이제받을 수 있습니다.

+1

오라클 구문을 사용할 수 없습니다. [트리거 기능] (https://www.postgresql.org/docs/current/static/plpgsql-trigger.html) ('RETURNS trigger')을 만들고 [CREATE TRIGGER] (https :// /postgresql.org/docs/current/static/sql-createtrigger.html). –

+1

이것은 PostgreSQL에 유효한 구문이 아닙니다. 'raise_application_error' 함수 호출에서 오라클을 위해 생성 될 수있는 것 같습니다. 가능한 경우 PostgreSQL 용 스크립트를 생성하십시오. – pozs

+1

'... 인터럽트 발생시 SOURCE_OPEN_DATA -'SOURCE_PARAMETRE' 외래 키 제약 조건을위한 것입니다. – joop

답변

1

TL; 이것은 적절한 PostgreSQL 트리거 구문이 아니며 다른 데이터베이스에서도 작동하지 않을 것이라고 생각되는 오류가 있습니다.

PostgreSQL에서 트리거에 대한 프로 시저로 SQL 문을 실행할 수 없습니다. 실제 프로 시저/함수를 작성하여 트리거에 제공해야합니다.

또한 IF 조건에는 일부 부품 (참조하는 행 유형)이 누락되어 있으며 아무런 이유없이 세미콜론이 있습니다. 트리거는 NEWROW에 액세스 할 수 없으며 대신 NEW라고합니다.

PostgreSQL 트리거에는 REFERENCING 키워드가 없으므로 FROM 키워드가 있지만 대부분의 경우 사용해서는 안됩니다.

SELECT INTO에는 변수를 선언해야하므로 일반 SQL 대신 plpgsql 언어가 필요합니다. 특정 사용자가 특정 필드에 데이터를 수정하지 않으려면

--example trigger procedure 
CREATE OR REPLACE FUNCTION prevent_update() RETURNS TRIGGER AS $func$ 
BEGIN 
    RAISE EXCEPTION 'You cannot modify whatever column'; 
    RETURN OLD; --not really needed 
END; 
$func$ LANGUAGE plpgsql; 

--example trigger 
CREATE TRIGGER TU_SOURCE_OPEN_DATA 
AFTER UPDATE ON SOURCE_OPEN_DATA 
FOR EACH ROW 
WHEN (OLD.ID_SOURCE_PARAMETRE IS DISTINCT FROM NEW.ID_SOURCE_PARAMETRE) 
EXECUTE PROCEDURE prevent_update(); 

이 외에도, PostgreSQL을에 열 권한에 따라 사용할 수 있습니다. 그러나 내가 올바른 것을 기억하면 다음과 같이해도 오류가 발생합니다.

UPDATE table SET column1 = column1; 

따라서이 열을 완전히 생략해야합니다.

0

다음을 제거 할 수 있습니다. : 이전 : 및 : NEW. 문서에서 (https://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html), 이전 및 신규 전에 :이 없습니다.

+0

추출 대상을 PostgreSQL에서 Postgre9.1로 변경함으로써 스크립트도 변경되었습니다. 편집을 참조하십시오. 또한 : OLD 및 : NEW를 변경했습니다. –

+1

시도 : SOURCE_OPEN_DATA의 DROP TRIGGER TU_SOURCE_OPEN_DATA; –

+0

그 트릭을 했어! 그것의 첫 번째 단계는 –

관련 문제