2012-04-26 46 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