Postgresql
區分模式和數據庫
我有
cross-database references are not implemented: scan.location.alias
這個 PL/pgSQL 程式碼的錯誤:DECLARE v_tmp_host scan.location.alias%TYPE; v_ip_address character varying; BEGIN -- Some assignment to v_ip_address v_tmp_host := v_ip_address::scan.location.alias%TYPE;
由於程式碼工作了很長時間,我調查並發現,“掃描”是該觸發器所在的數據庫中的一個模式,並且幾天前有人創建了一個名為“掃描”的數據庫。由於現在“掃描”既是數據庫也是架構,pg 似乎使用數據庫而不是架構。
我的問題是,將來如何避免此類問題?我應該如何編寫此程式碼以免因創建其他關係、數據庫或模式而被破壞?
或者換句話說:在這種情況下,如何強制 pg 使用模式而不是數據庫?
您必須將變數聲明為所需的類型。該
%TYPE
構造用於複製類型,因此僅在該DECLARE
部分中可用。作為回報,分配會更簡單:DECLARE v_tmp_host scan.location.alias%TYPE; v_ip_address character varying; BEGIN v_ip_address := '127.0.0.1'; v_tmp_host := v_ip_address; [...]
對您的程式碼的唯一更改是我完全省略了分配中的演員表。在這種情況下,PostgreSQL 不會嘗試解析
scan
為數據庫名稱,因為沒有實現跨數據庫引用…如果你用某種類型聲明了你的變數,賦值將嘗試將給定的值轉換為該類型。如果失敗,您將收到錯誤消息。由於正常
inet
輸入只是一個單引號字元串,因此 avarchar
將被接受(如果其格式符合inet
輸入格式)。