我有一个视图,希望使用insert
触发类型对其上的update
和instead of ...
操作进行“劫持”。
天真的,我以为我会突变一些值并执行insert
或update
命令:
declare
gender varchar;
date_of_birth varchar;
begin
gender = case new.gender when 2 then 'female' else 'male' end;
date_of_birth = extract(epoch from to_timestamp(new.date_of_birth, 'YYYY-MM-DD'))::int;
if tg_op = 'INSERT' then
insert into public.users (
name, mail, mobile_phone, pass, picture, fname, lname, fud_bday, active_coins, is_club_member, status, sex, eloqua_id, eloqua_guids
) values (
new.username, new.email, new.password, new.avatar, new.first_name, new.last_name, date_of_birth, new.active_coins, new.is_club_member, new.status, gender, new.eloqua_id, new.eloqua_guids
);
end if;
if tg_op = 'UPDATE' then
update public.users set
name = new.username,
mail = new.email,
pass = new.password,
...
where uid = old.id;
end if;
return new
end;
乍一看似乎还可以,但是当我不插入或更新所有列时会发生什么?假设我只想更新用户的电子邮件地址,触发器将尝试更新每一个列,从而导致错误(由于未指定其余列)或错误地将其覆盖为null
。 insert
操作也是如此。
有什么办法可以让触发器函数仅insert
或update
实际存在的列吗?