我在postgresql中遇到触发器问题。我有两张桌子。
CREATE TABLE Worker (
idWorker SERIAL NOT NULL ,
Name VARCHAR ,
LastName VARCHAR ,
Spec VARCHAR ,
PRIMARY KEY(idWorker));
CREATE TABLE Boss (
idBoss SERIAL NOT NULL ,
Name VARCHAR ,
LastName VARCHAR ,
Password VARCHAR,
PRIMARY KEY(idBoss));
我写了函数
create function addBoss() returns trigger LANGUAGE 'plpgsql' as'
DECLARE
password varchar;
BEGIN
password = tg_argv [0];
insert into Boss(name,LastName,password) values(new.imie,new.lastname,password);
RETURN NULL;
END;
';
现在,我应该创建触发器,但我不知道如何。触发器应该在Boss表中创建具有相同名称和姓氏的新行,如在Worker表中,但在将新数据插入Worker表后,密码应该是随机的。
答案 0 :(得分:0)
手册在这种情况下非常有用,并且包含您可以参考的示例。
正确的语法(截至9.5)是:
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
ON table_name
[ FROM referenced_table_name ]
[ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( condition ) ]
EXECUTE PROCEDURE function_name ( arguments )
where event can be one of:
INSERT
UPDATE [ OF column_name [, ... ] ]
DELETE
TRUNCATE
我真的没有看到使用TG_ARGV[]
特殊变量。您可以在调用触发器的过程中生成随机密码,或使用外部密码并在其中调用。
对于您的特定情况,该陈述可能如下:
CREATE TRIGGER after_insert_worker
AFTER INSERT ON worker
FOR EACH ROW
EXECUTE PROCEDURE addboss();
我假设AFTER TRIGGER
,因为您使用的RETURN NULL
在后触发器中被忽略,我看到您要在worker
表中插入一行。
为了这个答案的完整性,将参数传递给触发器执行的函数的正确方法是将它们像普通输入值一样传递给常规函数,即: < / p>
EXECUTE PROCEDURE proc_name('trigger_arg1', ...)
TG_ARGV []
数据类型文本数组;来自CREATE TRIGGER语句的参数。索引从0开始计数。索引无效(小于0或 大于或等于tg_nargs)会产生空值。
大胆强调我的。
此主题已在此处多次讨论过。 有很多方法可以实现这个目标,其中没有一个是完美的,但我怀疑有任何完美的解决方案。只要它完成了你的工作,就认为它已经足够了。