Postgresql

區分模式和數據庫

  • November 20, 2012

我有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輸入格式)。

引用自:https://dba.stackexchange.com/questions/28973