Postgresql
如何完全隱藏所有其他使用者和角色的功能?
數據庫: 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)
無需刪除該功能,會話終止時將其刪除。沒有人(即使您是另一個並發會話中的同一使用者)可以看到該功能。