[pgsql-jp: 33616] トリガとルール

CM illuminate33 @ hotmail.com
2004年 7月 11日 (日) 15:18:46 JST


質問

突然のメール失礼します。RDBMSの仕事が突然入ってきて困っている素人です。
今トリガ設定やpl/pgSQLなど勉強中です。

Windows 2000 Serverで、postgreSQLはcygwinを使って動かしています。
開発アプリケーションの都合上、postgreSQLもcygwinも不用意にバージョンを変える
ことはできない状態です。
(完成版は直接UNIXを使うと思いますが。)

cygwin: 1.3.12-4
postgreSQL: 7.2.1-2

たぶんあまりにも初歩的な質問ですので、それくらい自分で調べなさいと皆さんなら
おっしゃいそうですが、
(先週やっとpsqlコマンドを通してviで関数を読み込んだり、このバージョンなら戻
り値をopaqueにしなければならないことを理解しました。)

trigger、functionやruleでなにができるか、できないか教えていただけないでしょ
うか?「どうやってやるのか?」までは教えていただけなくても、
「これはできる。後は自分でやってみなさい。」と言われるととても励みになります
ので。(もちろん教えてくださるのなら大歓迎です。)

不特定多数のテーブルへのトリガ、ルール

開発の都合上、特定のDBにアプリケーション側から登録されたテーブル全てにトリガ
もしくはルールが動くように設定しなければならないのですが。
今持っているオライリージャパンの「実践postgreSQL」という本によると、どちら
も、テーブルの名称に反応するようになっています。

これを%[テーブル名]%などにして、特定名のテーブルに全て同じ処理を施すようにす
ることは可能なのでしょうか?もし不可能なら、同様の処理を他の手段で行

うことはできないのでしょうか?(本によると、各トリガは関数(function)に属して
いて、テーブルには属していないと書いているのですが。)


こんな感じです。全て前後でDROP TABLEを施しています。
<<
--あいまい呼び出しトリガtest

--一回目、自動生成数を不用意に主キーに使ったため、エラー?
$ psql -f AmbiTableTrig.sql psqldb
psql:AmbiTableTrig.sql:2: NOTICE:  CREATE TABLE / PRIMARY KEY will create
implic
it index 'ambitrig23test_pkey' for table 'ambitrig23test'
CREATE
psql:AmbiTableTrig.sql:7: ERROR:  parser: parse error at or near ")"
psql:AmbiTableTrig.sql:8: ERROR:  parser: parse error at or near "return"
psql:AmbiTableTrig.sql:9: NOTICE:  COMMIT: no transaction in progress
COMMIT
psql:AmbiTableTrig.sql:14: ERROR:  parser: parse error at or near "'"



CREATE TABLE AmbiTrig23Test (alpha timestamp, beta varchar, PRIMARY KEY
(alpha));

CREATE FUNCTION AmbiTableFunc() RETURNS opaque AS '
DECLARE
 BEGIN INSERT INTO TG_RELNAME (alpha, beta) VALUES (timestamp('NOW'),
'successive_test');
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER Ambi_Trig AFTER UPDATE OR INSERT ON %AmbiTrig23% FOR EACH ROW
EXECUTE PROCEDURE AmbiTableFunc();


--二回目、時刻スタンプを主キーに使ってみる。
$ psql -f AmbiTableTrig.sql psqldb
psql:AmbiTableTrig.sql:5: NOTICE:  CREATE TABLE / PRIMARY KEY will create
implic
it index 'ambitrig23test_pkey' for table 'ambitrig23test'
CREATE
psql:AmbiTableTrig.sql:8: ERROR:  parser: parse error at or near "INSERT"
psql:AmbiTableTrig.sql:9: ERROR:  parser: parse error at or near "return"
psql:AmbiTableTrig.sql:10: NOTICE:  COMMIT: no transaction in progress
COMMIT
psql:AmbiTableTrig.sql:15: ERROR:  parser: parse error at or near "'"
--似たようなエラーです。

CREATE TABLE AmbiTrig23Test (alpha timestamp, beta varchar, PRIMARY KEY
(alpha));

CREATE FUNCTION AmbiTableFunc() RETURNS opaque AS '
DECLARE
 BEGIN INSERT INTO TG_RELNAME (alpha, beta) VALUES ('NOW',
'successive_test');
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER Ambi_Trig AFTER UPDATE OR INSERT ON %AmbiTrig23% FOR EACH ROW
EXECUTE PROCEDURE AmbiTableFunc();

--三回目、もしやトリガのTG_RELNAMEがまずいのではと思い、引数を使ってみる。

CREATE TABLE AmbiTrig23Test (alpha timestamp, beta varchar, PRIMARY KEY
(alpha));

CREATE FUNCTION AmbiTableFunc(varchar) RETURNS opaque AS '
DECLARE testtable ALIAS FOR $1;
  
 BEGIN INSERT INTO (alpha, beta) VALUES ('NOW', 'successive_test');
RETURN NEW;
END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER Ambi_Trig AFTER UPDATE OR INSERT ON %AmbiTrig23% FOR EACH ROW
EXECUTE PROCEDURE AmbiTableFunc(TG_RELNAME);

>>
三回目も失敗しました。

もしこちらでこういう初歩的な質問をするのが不適切なら、どちらですれば良いのか
教えて頂ければ幸いです。





pgsql-jp メーリングリストの案内