2012-04-26 57 views
1

我的数据库已经隐含从整型转换为文本,所以我得到了一些“操作符不是唯一的”问题。我试图删除运算符|| (文本,anynonarray)没有成功,该错误信息是如何在Postgresql中强制删除一个运算符?

ERROR: cannot drop operator ||(text,anynonarray) because it is required by the database system SQL state: 2BP01

我有没有这个运营​​商的另一个数据库,所以我觉得有可能以某种方式。我无法在数百个查询中添加显式强制转换,既不删除隐式强制转换。有一种方法可以强制这个操作员的移动?

+0

2BP01表示它有依赖对象,您是否在drop命令中使用级联进行了尝试? http://www.postgresql.org/docs/9.1/interactive/sql-dropoperator.html要小心级联,它可能会降低更多,然后你想要先备份。 – Eelke 2012-04-26 16:43:26

+0

DROP OPERATOR ||(anynonarray,text)CASCADE;错误仍在继续。 – 2012-04-26 16:51:02

+1

这是一个系统操作员,即你不能放弃它。 – 2012-04-26 17:11:17

回答

-1

似乎我明白了。诀窍是从pg_operator表中删除权限。

delete from pg_operator where oprname = '||' and (oprleft = 25 or oprleft = 2776) and oprleft != oprright 

因为我想删除这些运营商:

OPERATOR ||("text", anynonarray);

OPERATOR ||(anynonarray, "text");

我不知道是否有任何的影响,虽然,似乎确定至今。

+3

有点可怕的解决方案... – vyegorov 2012-04-26 20:52:37

+0

你是从基本的Postgres系统中删除运算符:'textanycat'和'anytextcat'。表达式“a”:: text || '1':: int'或''1':: int || 'a':: text'通常会评估为文本'a1' /'1a'会产生错误。扩展或客户端或任何SQL代码可能会假设这些运算符并意外失败。总之:**不要在家里尝试这种方式!** – 2012-06-27 23:26:01

+0

选择'a':: text || '1':: int,另一个并没有产生错误 – 2012-06-28 13:52:35