代码之家  ›  专栏  ›  技术社区  ›  Andrew

测试PostgreSQL中的任何相关行

  •  0
  • Andrew  · 技术社区  · 6 年前

    我有一个PostgreSQL[10.5]数据库,它有一个相当丰富的模式。我有一个 CUSTOMER_CONTACT delete cascade delete restrict .

    表引用了客户联系人。如果他们中的任何一个这样做了,客户联系人就不能被删除。

    我如何提前确定 表引用客户联系人,允许我在知道不允许的情况下隐藏用户界面删除操作?

    除了依次手动检查每个表,还有其他方法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Alexey Soshin    6 年前

    这个想法是一个大的“尾巴摇狗”的事情。您试图基于业务结构来指示业务逻辑,而不是业务逻辑指示数据库结构。

    但这仍然是可能的,例如使用存储过程:

    首先,我将创建一些虚拟表:

    create table CUSTOMER_CONTRACT (id int PRIMARY KEY );
    
    create table CUSTOMER_CONTRACT_REF (id int PRIMARY KEY,
    customer_id int REFERENCES CUSTOMER_CONTRACT(id));
    

    create or REPLACE function can_delete_contract(id int) returns boolean AS $$
    BEGIN
    
      delete from CUSTOMER_CONTRACT c
        where c.ID = 1;
    
      return true;
    EXCEPTION
      WHEN FOREIGN_KEY_VIOLATION then
        return false;
    END;
    $$ LANGUAGE plpgsql;
    

    如果出现异常,它将自动回滚。

    现在进行一些测试:

    select can_delete_contract(1); // true
    
    insert into CUSTOMER_CONTRACT values (1);
    
    select can_delete_contract(1); // true
    
    insert into CUSTOMER_CONTRACT values (1);
    insert into CUSTOMER_CONTRACT_REF values(1, 1);
    
    select can_delete_contract(1); // false