替换用作表

时间:2015-05-27 13:58:55

标签: postgresql

我有函数,它为某些表(大约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()
...

有没有简单的方法如何在现有函数中添加可选属性?

2 个答案:

答案 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'

但我不确定这是否正确。