Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql PostreSQL触发器不允许没有异常的操作_Postgresql_Triggers - Fatal编程技术网

Postgresql PostreSQL触发器不允许没有异常的操作

Postgresql PostreSQL触发器不允许没有异常的操作,postgresql,triggers,Postgresql,Triggers,试图解决一个大学作业的问题。表中的每一行都有一个日期字段,我需要禁止删除该字段小于5年的行。使用触发器是必需的,它不能引发异常。我怎么做?我尝试过类似的方法,但不起作用: create or replace function no_change() returns trigger as $no_change$ begin if current_timestamp - old.date <= interval '5y' then new = old; end if; re

试图解决一个大学作业的问题。表中的每一行都有一个日期字段,我需要禁止删除该字段小于5年的行。使用触发器是必需的,它不能引发异常。我怎么做?我尝试过类似的方法,但不起作用:

create or replace function no_change()
returns trigger as $no_change$
begin
  if current_timestamp - old.date <= interval '5y' then
    new = old;
  end if;
  return new;
end;
$no_change$ language plpgsql;

create trigger no_change after delete on wiz
for each row execute procedure no_change();
创建或替换函数无更改()
将触发器返回为$no_change$
开始
如果当前时间戳-old.date位于:

在之前激发的行级触发器可以返回null,以指示触发器管理器跳过此行的其余操作(即,不会激发后续触发器,并且不会对此行执行插入/更新/删除操作)

对于DELETE上的before触发器,返回值没有直接影响,但必须为非null才能继续执行触发器操作。注意,NEW在DELETE触发器中为null,因此返回该值通常是不明智的。DELETE触发器中的惯用用法是返回旧触发器

因此,如果日期少于5天,只需返回NULL。

在:

在之前激发的行级触发器可以返回null,以指示触发器管理器跳过此行的其余操作(即,不会激发后续触发器,并且不会对此行执行插入/更新/删除操作)

对于DELETE上的before触发器,返回值没有直接影响,但必须为非null才能继续执行触发器操作。注意,NEW在DELETE触发器中为null,因此返回该值通常是不明智的。DELETE触发器中的惯用用法是返回旧触发器


因此,如果日期少于5天,只需返回NULL。

未测试,但应该可以工作

create or replace function no_change()
returns trigger as $no_change$
begin
  if current_timestamp - old.date <= interval '5y' then
     RETURN NULL;
  ELSE
     RETURN OLD;
  end if;
 
end;
$no_change$ language plpgsql;

create trigger no_change BEFORE delete on wiz
for each row execute procedure no_change();

创建或替换函数无更改()
将触发器返回为$no_change$
开始

如果当前时间戳-old.date未测试,但应正常工作

create or replace function no_change()
returns trigger as $no_change$
begin
  if current_timestamp - old.date <= interval '5y' then
     RETURN NULL;
  ELSE
     RETURN OLD;
  end if;
 
end;
$no_change$ language plpgsql;

create trigger no_change BEFORE delete on wiz
for each row execute procedure no_change();

创建或替换函数无更改()
将触发器返回为$no_change$
开始

如果当前_timestamp-old.date读取文档是一个好的开始,“在之后激发的行级触发器或在之前或之后激发的语句级触发器的返回值总是被忽略;它也可能为null。但是,这些类型的触发器中的任何一种都可能通过引发错误中止整个操作。”在触发器之前使用
。我确实读过文档,他们说删除触发器中有新的触发器,但它只是空的。无论如何,你的评论都无助于解决问题。试图让你使用文档来解决你的问题有助于解决问题。我只是比我应该的更乐观。在任何情况下,请看我的答案。阅读文档将是一个良好的开端“在之后激发的行级触发器或在之前或之后激发的语句级触发器的返回值始终被忽略;它也可能为null。但是,这些类型的触发器中的任何一种都可能通过引发错误中止整个操作。”在触发器之前使用
。我确实读过文档,他们说删除触发器中有新的触发器,但它只是空的。无论如何,你的评论都无助于解决问题。试图让你使用文档来解决你的问题有助于解决问题。我只是比我应该的更乐观。无论如何,请看我的答案。