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 

i "がトリガーD'挿入" までを削除しようとして、やはりエラー

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 

を得ました初めてトリガーを使用する...助けてください

EDIT: @Laurenz Albeと@pozsが正しく指摘したように、それは確かにOracle構文です。これは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

ここではOracle構文を使用できません。 [トリガ機能](https://www.postgresql.org/docs/current/static/plpgsql-trigger.html)( 'RETURNS trigger')を作成し、その機能を[CREATE TRIGGER'](https: /www.postgresql.org/docs/current/static/sql-createtrigger.html)。 –

+1

それはPostgreSQLのための有効な構文ではありません。 'raise_application_error'関数呼び出しから、それはOracle用に生成されるようです。可能であれば、PostgreSQL用のこれらのスクリプトを具体的に生成してください。 – pozs

+1

'...間の出現の間にSOURCE_OPEN_DATAが発生します。 - それ以外のキーの制約が意図しているのは、SOURCE_PARAMETREです。 – joop

答えて

1

TL; DR;これは適切なPostgreSQLのトリガ構文ではなく、他のデータベースでも動作しないと思われるエラーがいくつかあります。

トリガのプロシージャとしてSQL文をPostgreSQLで実行することはできません。実際のプロシージャ/ファンクションを作成し、トリガ用に供給する必要があります。

これに加えて、IF条件にはいくつかの部分(参照しているROW型)がなく、理由がないためセミコロンがあります。トリガーにはNEWROWへのアクセス権がありません。代わりにNEWと呼ばれます。

PostgreSQLトリガーのREFERENCINGキーワードはありませんが、FROMキーワードがありますが、ほとんどの場合は使用しないでください。

SELECT INTOには変数を宣言する必要があるため、plaintextではなく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

あなたは:from:OLDと: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

それはトリックでした!それは最初のステップだ –

関連する問題