我可以阻止 DROP COLUMN 在 PostgreSQL 9 或 10 或更高版本中的特定表上成功吗?
我的应用程序对列永远存在而不是消失做了一些假设。我怕后来的程序员忘记这个约束。
我知道触发器可以触发来控制行的插入、修改和删除。但是DDL呢?我可以防止表结构发生某些变化吗?
安全可能是一种方式,为用户和角色分配权限。但是这些未来的程序员将被允许添加列,只禁止删除列。
我不担心恶意活动。我正在防御那些可能行动太快而无法记住大局的急切海狸。
有事件触发器来控制 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)
| 归档时间: |
|
| 查看次数: |
906 次 |
| 最近记录: |