标签: postgresql

多个表的一个触发器

我在 PostgreSql 9.1 中有一个触发器,我想在插入多个表时触发它。是否可以让它影响所有这些表而不是为所有这些表创建触发器?我有 58 个表,我想使用调用触发器函数的同一个插入触发器,所以我一直在使用

create trigger tuweke 
after insert on product 
for each row execute procedure tuwekeAdjustextract(); 
create trigger tuweke 
after insert on caneweightment 
for each row execute procedure tuwekeAdjustextract(); 
...
Run Code Online (Sandbox Code Playgroud)

对所有这些表都这样做,然后我们有多个模式,所以工作量很大,这可以在一个查询中完成吗?然后影响该模式或整个数据库中的所有表?

postgresql trigger database-design postgresql-9.1

6
推荐指数
1
解决办法
2万
查看次数

在 json/jsonb 行上使用 IS DISTINCT FROM 触发而不进行比较逐项?

当表具有 json 或 jsonb 列时,是否无法在 INSERT/UPDATE 触发器中进行全行比较?我收到的错误让我认为我需要单独比较每一列,因为该NEW.*/OLD.*格式不能用于比较 json 列。

CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
    NEW.modified_at = now();
    RETURN NEW;
  ELSE
    RETURN OLD;
  END IF;
END;
$$ language 'plpgsql';

CREATE TRIGGER mytable_insert_update
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE on_insert_update_modified();
Run Code Online (Sandbox Code Playgroud)

当我插入包含 json 和 jsonb 列的表时,出现以下错误:

CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
  IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
    NEW.modified_at …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger plpgsql json postgresql-9.6

6
推荐指数
1
解决办法
2214
查看次数

为什么使用 GiST 索引来过滤非前导列?

我总是了解到并理解,只有当我们对前导(或所有)列有谓词时才能使用索引。现在,令我惊讶的是,我注意到以下查询中使用了GiST 索引。这是为什么?这是 GiST 索引的特殊功能吗?

CREATE TABLE t1 (
    i INT, 
    j INT, 
    k INT
);

INSERT INTO t1 
SELECT i, j, k 
FROM   GENERATE_SERIES(1, 100) AS i, 
       GENERATE_SERIES(1, 100) AS j, 
       GENERATE_SERIES(1, 100) AS k;

CREATE INDEX ON t1 USING GiST(i, j, k);

EXPLAIN SELECT * FROM t1 WHERE k = 54;
Run Code Online (Sandbox Code Playgroud)
QUERY PLAN
Bitmap Heap Scan on t1  (cost=199.03..5780.51 rows=5000 width=12)
  Recheck Cond: (k = 54)
  ->  Bitmap Index Scan on t1_i_j_k_idx  (cost=0.00..197.78 rows=5000 width=0)
        Index Cond: …
Run Code Online (Sandbox Code Playgroud)

postgresql index-tuning gist-index postgresql-12

6
推荐指数
1
解决办法
1758
查看次数

错误:无法删除角色“user1”,因为某些对象依赖于它

在我的 Google Cloud SQL 数据库实例 (Postgres 9.6) 上,我无法通过 GCP Console 删除通过 GCP Console 创建的用户/角色。当我尝试时,控制台显示一条通知,显示“用户已删除”,然后经过进一步检查,我发现操作失败并出现“未知错误”。实例的错误日志显示以下错误:

06:42:36.347 UTC [199]: [1-1] db=cloudsqladmin,user=cloudsqlagent ERROR:  role "user1" cannot be dropped because some objects depend on it
06:42:36.347 UTC [199]: [2-1] db=cloudsqladmin,user=cloudsqlagent DETAIL:  privileges for database mydb
24 objects in database mydb
Run Code Online (Sandbox Code Playgroud)

可以通过运行看到 24 个对象

06:42:36.347 UTC [199]: [1-1] db=cloudsqladmin,user=cloudsqlagent ERROR:  role "user1" cannot be dropped because some objects depend on it
06:42:36.347 UTC [199]: [2-1] db=cloudsqladmin,user=cloudsqlagent DETAIL:  privileges for database mydb
24 objects …
Run Code Online (Sandbox Code Playgroud)

postgresql google-cloud-sql postgresql-9.6

6
推荐指数
1
解决办法
8190
查看次数

Postgres 的 UPDATE SET x = NULL 策略

目前尚不清楚当列设置为 时 Postgres 采取的策略NULL

UPDATE tbl SET
  col1 = NULL,
  col2 = NULL
WHERE created < current_date - INTERVAL '1 year';
Run Code Online (Sandbox Code Playgroud)

文档https://www.postgresql.org/docs/current/mvcc.html有点冗长和技术性,所以我无法可靠地推断:

是否就地执行设置为 NULL 或复制受影响的行/页

看起来任何 UPDATE 都应该为 MVCC 语义创建新行,但如果设置为 NULL 是一种特殊情况怎么办?

为了遵守 GDPR,我认为要清空所有个人历史数据,并尝试理解大规模定期数据的含义UPDATE SET x = NULL。我应该考虑VACUUM之后吗?

postgresql vacuum postgresql-performance

6
推荐指数
1
解决办法
2万
查看次数

Postgres 可重复读取与可序列化

我试图了解可重复读取隔离级别是否足以满足我在使用 Postgres 的应用程序中的场景,但文档使得很难理解哪个最适合。

我有一个应用程序启动一个事务,该事务首先根据单行的主键读取该行的当前值,在从消息队列接收到事件后计算该行的新状态应该是什么,然后更新数据库中该行的状态。

假定部署了应用程序的多个实例,并且可以同时接收到同一个主键的消息队列上的多个事件,则有可能有 2 个事务可能会尝试同时进入上述事务。对于这种情况,隔离是否repeatable read足够好,或者我是否需要考虑使用serializable?我的假设是,如果第一个事务尝试将其结果提交到数据库,而第二个事务正在进行中,则第二个事务将因冲突而失败,因为它发现它尝试更新的行已被第一个事务修改 -它是否正确?

还有一个后续问题:我想了解使用可序列化事务隔离与可重复读取相比“昂贵”多少 - 我想了解 postgres 内发生的情况的底层机制 - 即是否存在锁定,这对同时运行的其他查询的性能有何影响?

postgresql transaction

6
推荐指数
1
解决办法
3193
查看次数

Postgresql:修改嵌套 json 列内的一个值

我在“资产”表中有一个名为“参数”的 json 列。json 是嵌套的并具有以下结构:

{
"params1": {"k": 1.1, "efficiency": 0.7}, 
"params2": {"k": 1.9, "C_max": 100.0, "C_min": 10.0}
}
Run Code Online (Sandbox Code Playgroud)

我只想更新“params2”中的一个值“k”,并保持其余值不变。我尝试使用以下代码:

update "Assets" 
set "Parameters" = "Parameters"::jsonb || '{"params2":{"k":2.2}}'::jsonb
where "Id" = 185;
Run Code Online (Sandbox Code Playgroud)

这导致

{
"params1": {"k": 1.1, "efficiency": 0.7}, 
"params2": {"k": 2.2}
}
Run Code Online (Sandbox Code Playgroud)

因此“params2”中的其余参数被删除,这是不希望的。修改“k”并保持其余部分不变的方法是什么?

postgresql json

6
推荐指数
1
解决办法
2万
查看次数

将逗号分隔的记录拆分为自己的行

我有下表,名为商店:

store_id INT
emails VARCHAR
Run Code Online (Sandbox Code Playgroud)

其中包含值:

商店ID 电子邮件
1 user_1@example.com,user2@example.com
2 uswe3@example.com,user4@example.com
4 admin@example.com

我想生成以下集合:

商店ID 电子邮件
1 user_1@example.com
1 user2@example.com
2 uswe3@example.com
2 user4@example.com
4 admin@example.com

正如您所看到的,我想将电子邮件字段拆分为仅包含一个电子邮件地址的单独记录。你知道我该怎么做吗?

到目前为止,我成功创建了以下查询:

select store_id,string_to_array(emails,',') from stores
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将其拆分string_to_array为自己的行。

postgresql string-splitting

6
推荐指数
1
解决办法
1万
查看次数

是否有必要清理 PostgreSQL 物化视图?

我知道分析物化视图 (MV) 是有意义的,但由于 MV 不可更新,这是否意味着我们不需要清理 MV?

postgresql materialized-view vacuum

6
推荐指数
1
解决办法
2041
查看次数

基于另一列中的值的列约束

我有一个 PostgreSQL 表phase_steps,包含以下示例行:

phase_step_id|step_type|step_status|
-------------+---------+-----------+
            1| RESEARCH|           |
            2|   SURVEY|           |
        
Run Code Online (Sandbox Code Playgroud)

更新step_status列的值取决于该值 step_type是什么。
step_type为“RESEARCH”时,只能输入“COMPLETE”或“INCOMPLETE”值step_status
step_type为“SURVEY”时,只能输入“ASSIGNED”或“NOT ASSIGNED”值step_status

step_status我尝试通过以下过程管理“研究”约束:

create or replace function insert_step_status_value() returns trigger as $$
    begin
        if (new.step_status != 'COMPLETE') or (new.step_status != 'INCOMPLETE')
        from phase_steps where step_type = 'RESEARCH'
        then
            raise exception 'Status value not in range for this phase step';
        end if;
        return new;
    end;
$$ language plpgsql;

create trigger check_step_status_value before update …
Run Code Online (Sandbox Code Playgroud)

postgresql trigger database-design constraint check-constraints

6
推荐指数
1
解决办法
7905
查看次数