私はトリガ用の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;
繰り返しますが、これはただの抽出物です。今すぐ取得します
ここでは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)。 –
それはPostgreSQLのための有効な構文ではありません。 'raise_application_error'関数呼び出しから、それはOracle用に生成されるようです。可能であれば、PostgreSQL用のこれらのスクリプトを具体的に生成してください。 – pozs
'...間の出現の間にSOURCE_OPEN_DATAが発生します。 - それ以外のキーの制約が意図しているのは、SOURCE_PARAMETREです。 – joop