Postgres视图而不是触发器-仅插入和更新给定数据

时间:2019-03-06 06:03:48

标签: postgresql view database-trigger

我有一个视图,希望使用insert触发类型对其上的updateinstead of ...操作进行“劫持”。

天真的,我以为我会突变一些值并执行insertupdate命令:

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;

乍一看似乎还可以,但是当我不插入或更新所有列时会发生什么?假设我只想更新用户的电子邮件地址,触发器将尝试更新每一个列,从而导致错误(由于未指定其余列)或错误地将其覆盖为nullinsert操作也是如此。

有什么办法可以让触发器函数仅insertupdate实际存在的列吗?

0 个答案:

没有答案