[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 メーリングリストの案内