Postgresql

如何完全隱藏所有其他使用者和角色的功能?

  • July 13, 2019

數據庫: Postgres 9.6

**案例:**我有一個需要隱藏的功能,只有特定的角色/使用者才能看到它。我什至不想將函式的名稱或主體公開給其他使用者/角色。

例如,如果我有一個名為的使用者test1,那麼他不應該知道呼叫函式的存在top_secret_function_1(不是通過 PgAdmin 也不是通過任何其他命令。)

只有我想看到這個功能的使用者/角色才能看到這個功能。

重要性:此函式執行一些我不想公開的重要邏輯,但我仍然需要為其他一些使用者提供一些其他數據庫訪問權限。

更新 1

Klin 建議使用 pg_temp 但它似乎並不有效,但他的建議引發了使用不同模式的想法,然後將使用者/角色限制為模式。

當我重新連接數據庫時,秘密功能在 pg_temp 中不再有效!我不能按照建議使用 pg_temp,因為那樣我必須在每個使用者連接時在每個使用者 pg_temp 模式中定義函式

截至目前,PostgreSQL 中沒有內置功能可以僅授予特定使用者/角色執行訪問權限。函式原始碼始終可見。克林指出它是正確的“函式的原始碼仍然可見。”,但不知何故它會誤導,因為他添加了一些不完全滿足問題條件的腳本。

我真的希望這個功能很快就會出現在 postgres 中。

您可以撤銷授予特定 Postgres 角色的訪問權限,但函式的名稱和來源仍然可見。

要將函式保持在最高機密,請在 schema 中需要它的會話中創建它pg_temp。它是與會話關聯的用於保存臨時資源的模式。它會在需要時自動創建,並在會話結束時自動刪除。

create or replace function pg_temp.top_secret_function()
returns text language sql as $$
   select 'Top secret!'::text;
$$;

select pg_temp.top_secret_function();

CREATE FUNCTION
top_secret_function 
---------------------
Top secret!
(1 row)

無需刪除該功能,會話終止時將其刪除。沒有人(即使您是另一個並發會話中的同一使用者)可以看到該功能。

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