我有函数,它为某些表(大约400个表)生成uniq ID,例如:
CREATE TABLE my_table (
id bigint DEFAULT get_unique_id(),
...
)
我需要在该方法中添加可选属性。 现在我可以使用相同的名称和可选的attiribute创建新方法
CREATE OR REPLACE FUNCTION get_unique_id(swithattribute integer DEFAULT (-1)) ...
但我想只有一个这个名字的方法。
所以我需要替换原始的一个,但如果我尝试删除原始函数get_unique_id(),postgres会抛出我并且错误:
ERROR: cannot drop function get_unique_id() because other objects depend on it
DETAIL: default for table my_table column id depends on function get_unique_id()
default for table my_table2 column id depends on function get_unique_id()
...
有没有简单的方法如何在现有函数中添加可选属性?
答案 0 :(得分:0)
你可以运行:
begin;
alter table my_table alter column id set default -1;
create or replace function get_unique_id...; --insert new function definition here
alter table my_table alter column id set default get_unique_id();
commit;
但可能需要表独占锁,因此它可以阻止查询一段时间。
如果有很多表,您可以使用查询:
select 'alter table '||quote_ident(table_schema)||'.'||quote_ident(table_name)||' alter column '||quote_ident(column_name)||' set default -1;' from information_schema.columns where column_default='get_unique_id()';
生成所需的alter
语句。
答案 1 :(得分:0)
我发明了一些hack-y,但优雅而有效的解决方案。我创建了所需的函数作为临时
CREATE OR REPLACE FUNCTION get_unique_tmp(arg int default 0) ...
然后我通过这个临时函数
更改了PG目录中的原始文件(args和src)update pg_catalog.pg_proc
set proargtypes=x.proargtypes, proargnames=x.proargnames, proargdefaults=x.proargdefaults,prosrc=x.prosrc,pronargs=x.pronargs,pronargdefaults=x.pronargdefaults
from (select * from pg_catalog.pg_proc p where p.proname='get_unique_tmp') x
where pg_catalog.pg_proc.proname='get_unique_id'
但我不确定这是否正确。