带有 LibreOffice Base 前端的 PostgreSQL 触发器
PostgreSQL triggers with LibreOffice Base front-end
我在 PostgreSQL 12.1 中有以下触发器函数和触发器:
create or replace function constraint_for_present()
returns trigger
as $$
BEGIN
if
new.present_status = 'viewing'
and new.name not in (select viewable_item from sourcing)
then raise exception 'a present_status of "viewing" requires that the viewable item is in sourcing';
end if;
return new;
END;
$$ language plpgsql;
create trigger constraint_for_present
before insert or update of present_status on viewable_item
for each row
execute function constraint_for_present();
这些在 psql 和 TablePlus 客户端中输入数据期间按预期工作。但是,该函数在通过 LibreOffice Base 访问数据库时会抛出错误:
pq_driver: [PGRES_FATAL_ERROR]ERROR: relation "sourcing" does not exist
LINE 2: and new.name not in (select viewable_item from sourcing)
QUERY: SELECT new.present_status = 'viewing'
and new.name not in (select viewable_item from sourcing)
CONTEXT: PL/pgSQL function viewing.constraint_for_present() line 3 at IF
(caused by statement 'UPDATE "viewing"."viewable_item" SET "present_status" = 'none' WHERE "name" = 'test4'')
在 Base 中,我为触发器的 table 设置了一个简单的表单,每个外键列都设置为列表框,列表内容的类型设置为 Sql(也试过Sql [本地])。每个列表的内容是(具有适当的 table 和主键列):
select name from viewing.cv_present_status order by name
(出于组织政治原因,该数据库暂时使用自然键。)绑定字段设置为 0,这是显示的主键列。
所以... 2 个问题:
- 为什么这个问题只发生在 Base 中,我该如何解决它(或者至少更好地排除故障)?
- 由于绑定字段似乎只接受一个整数,这是否意味着您不能将列表框用于 table 具有多列主键,至少如果有一个显示列?
在触发函数中,可以完全限定table
...
and new.name not in (select viewable_item from viewing.sourcing)
...
我在 PostgreSQL 12.1 中有以下触发器函数和触发器:
create or replace function constraint_for_present()
returns trigger
as $$
BEGIN
if
new.present_status = 'viewing'
and new.name not in (select viewable_item from sourcing)
then raise exception 'a present_status of "viewing" requires that the viewable item is in sourcing';
end if;
return new;
END;
$$ language plpgsql;
create trigger constraint_for_present
before insert or update of present_status on viewable_item
for each row
execute function constraint_for_present();
这些在 psql 和 TablePlus 客户端中输入数据期间按预期工作。但是,该函数在通过 LibreOffice Base 访问数据库时会抛出错误:
pq_driver: [PGRES_FATAL_ERROR]ERROR: relation "sourcing" does not exist
LINE 2: and new.name not in (select viewable_item from sourcing)
QUERY: SELECT new.present_status = 'viewing'
and new.name not in (select viewable_item from sourcing)
CONTEXT: PL/pgSQL function viewing.constraint_for_present() line 3 at IF
(caused by statement 'UPDATE "viewing"."viewable_item" SET "present_status" = 'none' WHERE "name" = 'test4'')
在 Base 中,我为触发器的 table 设置了一个简单的表单,每个外键列都设置为列表框,列表内容的类型设置为 Sql(也试过Sql [本地])。每个列表的内容是(具有适当的 table 和主键列):
select name from viewing.cv_present_status order by name
(出于组织政治原因,该数据库暂时使用自然键。)绑定字段设置为 0,这是显示的主键列。
所以... 2 个问题:
- 为什么这个问题只发生在 Base 中,我该如何解决它(或者至少更好地排除故障)?
- 由于绑定字段似乎只接受一个整数,这是否意味着您不能将列表框用于 table 具有多列主键,至少如果有一个显示列?
在触发函数中,可以完全限定table
...
and new.name not in (select viewable_item from viewing.sourcing)
...