防止 PostgreSQL 中的 DROP COLUMN

Bas*_*que 5 postgresql ddl

我可以阻止 DROP COLUMN 在 PostgreSQL 9 或 10 或更高版本中的特定表上成功吗?

我的应用程序对列永远存在而不是消失做了一些假设。我怕后来的程序员忘记这个约束。

我知道触发器可以触发来控制行的插入、修改和删除。但是DDL呢?我可以防止表结构发生某些变化吗?

安全可能是一种方式,为用户和角色分配权限。但是这些未来的程序员将被允许添加列,只禁止删除列。

担心恶意活动。我正在防御那些可能行动太快而无法记住大局的急切海狸。

Abe*_*sto 9

事件触发器

事件触发器来控制 DDL,捕获事件sql_drop

打电话CREATE EVENT TRIGGER。在触发器函数中,检查被删除的对象是否是您的重要列之一。如果是这样,则引发回滚事务的异常。

sql_drop事件发生在ddl_command_end任何删除数据库对象的操作的事件触发器之前。要列出已被丢弃的对象,使用set-返回函数pg_event_trigger_dropped_objects()sql_drop事件触发代码(见第9.28)。请注意,触发器在对象从系统目录中删除后执行,因此无法再查找它们。

例子:

drop table if exists t;
drop event trigger if exists etg;
drop function if exists fetg();

create function fetg() returns event_trigger language plpgsql as $$
begin
  if exists (
    select 1
    from pg_event_trigger_dropped_objects() as t
    where
      t.object_type = 'table column' and
      t.object_identity like any(array['%.t.y', 'public.tt.zz']))
  then
    raise exception 'Columns t.y and public.tt.zz are important!';
  end if;
end $$;

create event trigger etg on sql_drop execute procedure fetg();

create table t(x int, y int);
alter table t drop column y;
Run Code Online (Sandbox Code Playgroud)

更多文档:
事件
函数

  • @EvanCarroll 如果您知道在哪里挖掘,一切都很简单:o) (2认同)