簡體   English   中英

我如何定義一個 plpgsql function,它接受一個沒有模式限定且尚未創建的類型的參數

[英]How can I define a plpgsql function that accepts a parameter of a type that is not schema qualified and is not yet created

我的數據庫是根據每個應用程序用戶的模式構建的。 在每個模式中,都有一個名為“條目”的相同表,具有完全相同的 DDL。 我還有一個通用模式,其中包含一些對這些“條目”表進行操作的函數,並且在執行過程中,搜索路徑定義了 function 對哪個模式的條目表進行操作。 在創建任何用戶模式之前,我在定義這些函數時遇到了問題,因為它們引用了用戶模式中尚未創建的表。 使用set check_function_bodies = off; 但是現在我遇到了一個類似的問題,即 function 將這些表引用為 inout 參數。 我無法創建 function,因為它接受的參數是“條目”類型,我收到“類型條目不存在”的錯誤。 set check_function_bodies = off並不能解決這個問題。 有沒有辦法解決這個問題? function 簽名是

create or replace function common.reconcile_user_entry(inout e entries) returns void

我真的不想在每個用戶模式中定義這個 function,因為它總是相同的,而且我不想在需要進行更改時在每個模式中重新編譯它。

您可以為此使用inheritance

像所有其他entries表一樣定義一個表common.entries並更改其他entries表以從它繼承:

ALTER TABLE schema1.entries INHERIT common.entries;

然后定義 function 以將common.entries作為參數或返回類型,您可以將它用於任何繼承的表。

我想你可以使用表 inheritance。

您必須為用戶模式中的每個表在公共模式中創建一個“父”表。 然后從他們那里繼承用戶表。 定義 function 參數時使用“父”表名。 參見示例:

CREATE TABLE parent(id integer);

CREATE TABLE child() INHERITS (parent);
INSERT INTO child(id) VALUES (1);

CREATE FUNCTION get_id(IN prm_row parent) RETURNS integer
LANGUAGE SQL
AS $$
  SELECT prm_row.id;
$$;

SELECT get_id((SELECT (child) FROM child WHERE id = 1));

請注意,父表將包含所有子表的記錄,因此您應該使用權限來防止用戶訪問父表。

我沒有使用 inheritance 而是通過繞過這樣的問題來解決它:

而不是將 function 簽名定義為

create or replace function common.reconcile_user_entry(inout e entries) returns void

我把它定義為

create or replace function common.reconcile_user_entry(inout r record) returns void

在 function 代碼中,我聲明了一個變量e entries; 然后將記錄分配給變量:

declare 
 e entries;
begin
 select into e r.*
...

關於 inheritance 解決方案,它有效,但我發現上述解決方案更簡單。 我知道我的解決方案一定有警告和隱藏的問題,如果有人可以指出,請指出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM