最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL實現跨數據庫授權查詢的詳細步驟

 更新時間:2025年10月23日 09:50:00   作者:安審若無  
在PostgreSQL中,由于一個數據庫實例下的不同數據庫在邏輯上是隔離的,你不能像在同一個數據庫內跨模式那樣直接查詢,因此,你需要分兩步走:先授權,后查詢,所以本文給大家介紹了PostgreSQL實現跨數據庫授權查詢的詳細步驟,需要的朋友可以參考下

引言

在PostgreSQL中,由于一個數據庫實例下的不同數據庫在邏輯上是隔離的,你不能像在同一個數據庫內跨模式(schema)那樣直接查詢。因此,你需要分兩步走:先授權,后查詢。

你已經完成了第一步“授權”,我們這里會先簡要回顧以確保授權正確,然后重點說明第二步,即B用戶如何查詢。

第一步:回顧與確認授權 (由A用戶或超級用戶執(zhí)行)

假設你的環(huán)境如下:

  • 數據庫 A: 用戶 a_user 是表 c 的所有者。
  • 數據庫 B: 用戶 b_user 需要查詢 a_user 在數據庫 A 中的表 c。

授權過程需要在數據庫 A 中執(zhí)行:

連接到數據庫 A

psql -d a -U a_user
# 或者使用超級用戶,如 postgres

授予權限

你需要至少授予 SELECT 權限。如果需要,還可以授予 INSERTUPDATEDELETE 等。

-- 授予 SELECT 權限
GRANT SELECT ON public.c TO b_user;

-- 如果需要所有權限,可以使用 ALL
-- GRANT ALL ON public.c TO b_user;

驗證權限 (可選)

可以檢查權限是否已正確授予。

\dp public.c
  • 在輸出中,你應該能看到 b_user 具有 r (SELECT) 權限。

重要提示: 僅僅這樣授權還不夠。因為 b_user 默認在數據庫 A 中沒有登錄權限(如果它是一個新用戶)。你需要確保 b_user 可以連接到數據庫 A。

確保 B 用戶能連接數據庫 A (如果尚未授權)

-- 在數據庫 A 中執(zhí)行,授予連接權限
GRANT CONNECT ON DATABASE a TO b_user;

-- 還需要授予 public schema 的使用權限(如果尚未擁有)
GRANT USAGE ON SCHEMA public TO b_user;

第二步:B 用戶進行查詢

現在,b_user 已經獲得了在數據庫 A 中查詢表 c 的權限。b_user 不能從數據庫 B 中直接訪問數據庫 A 的表。必須連接到數據庫 A 才能進行查詢。

以下是 b_user 的操作步驟:

連接到正確的數據庫

b_user 必須連接到 數據庫 A,而不是數據庫 B。

# 通過命令行連接
psql -d a -U b_user -W
  • -d a: 指定連接到數據庫 a
  • -U b_user: 指定使用用戶 b_user 登錄。
  • -W: 強制提示輸入密碼。

執(zhí)行查詢

連接成功后,你就可以像查詢普通表一樣,在 psql 命令行中執(zhí)行 SQL 查詢。

SELECT * FROM c LIMIT 10;

因為表 c 位于 public 模式中,而 public 模式在搜索路徑中,所以你可以直接使用表名 c。為了更清晰,你也可以使用完全限定名:

SELECT * FROM public.c LIMIT 10;

可能遇到的問題與解決方案

錯誤:權限被拒絕 (Permission denied)
請返回第一步,仔細檢查:

  1. GRANT CONNECT ON DATABASE a TO b_user; 是否已執(zhí)行?
  2. GRANT USAGE ON SCHEMA public TO b_user; 是否已執(zhí)行?
  3. GRANT SELECT ON public.c TO b_user; 是否已執(zhí)行?

錯誤:數據庫 “a” 不存在 (Database “a” does not exist)
請檢查數據庫名稱是否正確。可以使用 \l 命令(由超級用戶執(zhí)行)列出所有數據庫。

B 用戶想在數據庫 B 中直接查詢數據庫 A 的表
這是無法直接實現的。PostgreSQL 不支持跨數據庫查詢。如果這是硬性需求,你需要使用額外的工具:

  • 外部數據包裝器 (FDW): 這是最正統(tǒng)的解決方案。你可以在數據庫 B 中創(chuàng)建一個指向數據庫 A 的外部服務器,然后創(chuàng)建一個外部表來映射 a.public.c。之后,b_user 就可以在數據庫 B 中查詢這個外部表了。
  • 邏輯復制: 將表 c 從數據庫 A 復制到數據庫 B。
  • 程序邏輯: 在應用程序中分別連接兩個數據庫,然后在內存中進行數據關聯。

總結

對于你當前的需求,最簡單的流程就是:

  1. 授權方 (A用戶/超級用戶):在數據庫 A 中,授予 b_user 連接權限、模式使用權限和表的選擇權限。
  2. 使用方 (B用戶)連接到數據庫 A,然后執(zhí)行 SELECT * FROM c;。

B用戶不能在數據庫 B 中直接查詢 a.c,必須切換到數據庫 A 的連接中。

精細的權限控制,授權后怎么能讓b用戶連上數據庫a只能看到授權的表

這是一個很好的數據庫安全實踐問題。要讓B用戶連接上數據庫A后只能看到授權的表,需要進行精細的權限控制。以下是完整的實現方案:

解決方案

1. 創(chuàng)建專用模式(推薦)

最佳實踐是為B用戶創(chuàng)建一個專用模式,而不是使用public模式。

-- 以超級用戶或a_user身份在數據庫A中執(zhí)行
CREATE SCHEMA b_user_schema;

2. 將授權表移動到專用模式或創(chuàng)建視圖

方案A:移動表到專用模式

-- 將表移動到專用模式
ALTER TABLE public.c SET SCHEMA b_user_schema;

方案B:在專用模式中創(chuàng)建視圖(更靈活)

-- 在專用模式中創(chuàng)建視圖
CREATE VIEW b_user_schema.c_view AS 
SELECT * FROM public.c 
WHERE 1=1; -- 可以在這里添加行級權限控制

-- 或者直接復制表結構(如果不想移動原表)
CREATE TABLE b_user_schema.c AS SELECT * FROM public.c LIMIT 0;
-- 然后使用其他方式同步數據(如觸發(fā)器、作業(yè)等)

3. 設置搜索路徑和默認權限

-- 設置B用戶的搜索路徑,使其默認看到專用模式
ALTER USER b_user SET search_path TO b_user_schema, public;

-- 設置專用模式的默認權限(可選)
ALTER DEFAULT PRIVILEGES IN SCHEMA b_user_schema 
GRANT SELECT ON TABLES TO b_user;

4. 精確的權限控制

-- 撤銷所有默認權限
REVOKE ALL ON DATABASE a FROM b_user;
REVOKE ALL ON SCHEMA public FROM b_user;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM b_user;

-- 授予最小必要權限
GRANT CONNECT ON DATABASE a TO b_user;
GRANT USAGE ON SCHEMA b_user_schema TO b_user;
GRANT SELECT ON ALL TABLES IN SCHEMA b_user_schema TO b_user;

-- 如果使用視圖
GRANT SELECT ON b_user_schema.c_view TO b_user;

5. 隱藏系統(tǒng)信息

-- 禁止查看系統(tǒng)目錄(重要?。?
REVOKE ALL ON pg_catalog.pg_class FROM b_user;
REVOKE ALL ON pg_catalog.pg_namespace FROM b_user;
REVOKE ALL ON pg_catalog.pg_attribute FROM b_user;
REVOKE ALL ON pg_catalog.pg_type FROM b_user;

-- 或者更嚴格地,在postgresql.conf中設置
-- row_security = on

完整示例

-- 1. 創(chuàng)建專用模式
CREATE SCHEMA IF NOT EXISTS restricted_schema;

-- 2. 在專用模式中創(chuàng)建視圖
CREATE OR REPLACE VIEW restricted_schema.c_restricted AS 
SELECT id, name, created_date 
FROM public.c 
WHERE status = 'active';  -- 可以添加行級過濾

-- 3. 設置用戶權限
REVOKE ALL ON DATABASE a FROM b_user;
GRANT CONNECT ON DATABASE a TO b_user;

REVOKE ALL ON SCHEMA public FROM b_user;
GRANT USAGE ON SCHEMA restricted_schema TO b_user;

GRANT SELECT ON restricted_schema.c_restricted TO b_user;

-- 4. 設置用戶搜索路徑
ALTER USER b_user SET search_path TO restricted_schema;

-- 5. 保護系統(tǒng)目錄
REVOKE ALL ON pg_catalog.pg_class FROM b_user;
REVOKE ALL ON pg_catalog.pg_namespace FROM b_user;

驗證效果

讓B用戶連接數據庫A進行測試:

psql -d a -U b_user -W

連接后執(zhí)行:

-- 只能看到授權的視圖
\dt
-- 或
\dn+

-- 可以查詢授權視圖
SELECT * FROM c_restricted;

-- 嘗試訪問其他表會失敗
SELECT * FROM public.c;  -- 權限被拒絕
SELECT * FROM other_table;  -- 表不存在
\dt public.*  -- 看不到public模式下的表

更嚴格的安全設置

如果需要更高級別的隔離,可以考慮:

1. 使用行級安全策略(RLS)

-- 在表上啟用行級安全
ALTER TABLE public.c ENABLE ROW LEVEL SECURITY;

-- 創(chuàng)建策略只允許查看特定行
CREATE POLICY b_user_policy ON public.c
FOR SELECT TO b_user
USING (department = 'authorized_department');

2. 使用數據庫角色繼承

-- 創(chuàng)建只讀角色
CREATE ROLE read_only;
GRANT USAGE ON SCHEMA restricted_schema TO read_only;
GRANT SELECT ON ALL TABLES IN SCHEMA restricted_schema TO read_only;

-- 將用戶賦予角色
GRANT read_only TO b_user;

總結

通過這種精細的權限控制,B用戶連接數據庫A后:

  • ? 只能看到授權模式下的表/視圖
  • ? 只能執(zhí)行授予的操作(如SELECT)
  • ? 無法查看系統(tǒng)目錄和其他用戶的對象
  • ? 無法訪問public模式下的其他表

這種方案既滿足了業(yè)務需求,又遵循了最小權限原則,確保了數據庫的安全性。

以上就是PostgreSQL實現跨數據庫授權查詢的詳細步驟的詳細內容,更多關于PostgreSQL跨數據庫授權查詢的資料請關注腳本之家其它相關文章!

相關文章

  • postgreSQL的crud操作詳解

    postgreSQL的crud操作詳解

    這篇文章主要介紹了postgreSQL的crud操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL拆分字符串的三種方式

    PostgreSQL拆分字符串的三種方式

    這篇文章給大家介紹了PostgreSQL拆分字符串的三種方式,字符串轉為數組,字符串轉為列表和字符串轉為數據項,并通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • PostgreSQL時間相差天數實例例子代碼解析

    PostgreSQL時間相差天數實例例子代碼解析

    在PostgreSQL數據庫中計算兩個日期或時間戳之間的差異可以通過多種方法實現,常用的有通過日期轉換、AGE函數、INTERVAL和+運算符、DATE_PART函數以及利用CURRENT_DATE或NOW()函數,大家可以根據自己的需求選擇合適的方式,需要的朋友可以參考下
    2024-11-11
  • 無公網IP環(huán)境下的PostgreSQL遠程訪問方案

    無公網IP環(huán)境下的PostgreSQL遠程訪問方案

    本文提出了一種基于內內網穿透技術的PostPostQL遠程訪問解決方案,該方案無需公網IP,配置簡單且安全性可控,支持擴展性強,通過三步實現:隧道建立、端口映射和身份驗證,實測延遲5-ms、帶寬NMbps,適用于開發(fā)、數據查詢和報表導出場景,需要的朋友可以參考下
    2026-04-04
  • 基于Postgresql 事務的提交與回滾解析

    基于Postgresql 事務的提交與回滾解析

    這篇文章主要介紹了基于Postgresql 事務的提交與回滾解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL部署邏輯復制過程詳解

    PostgreSQL部署邏輯復制過程詳解

    這篇文章主要介紹了PostgreSQL部署邏輯復制過程詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-04-04
  • 如何將excel表格數據導入postgresql數據庫

    如何將excel表格數據導入postgresql數據庫

    這篇文章主要介紹了如何將excel表格數據導入postgresql數據庫,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • PostgreSQL的外部數據封裝器fdw用法

    PostgreSQL的外部數據封裝器fdw用法

    這篇文章主要介紹了PostgreSQL的外部數據封裝器fdw用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL COALESCE使用方法代碼解析

    PostgreSQL COALESCE使用方法代碼解析

    這篇文章主要介紹了PostgreSQL COALESCE使用方法代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • 關于向PostgreSQL數據庫插入Date類型數據報錯問題解決方案

    關于向PostgreSQL數據庫插入Date類型數據報錯問題解決方案

    本文給大家介紹在將數據庫從Oracle改為PostgreSQL時遇到的日期類型插入錯誤,通過使用PostgreSQL的特定語法和更改動態(tài)SQL語句解決了問題,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2024-12-12

最新評論

虹口区| 张家川| 布尔津县| 利津县| 北宁市| 措勤县| 沐川县| 林甸县| 东乡县| 临泉县| 盈江县| 太谷县| 怀远县| 政和县| 永平县| 长兴县| 金堂县| 武安市| 星子县| 喜德县| 洛扎县| 乌苏市| 昆山市| 石台县| 宾阳县| 若尔盖县| 司法| 景宁| 秦安县| 定襄县| 晋中市| 峨边| 曲周县| 中宁县| 银川市| 剑河县| 云南省| 大连市| 社会| 若尔盖县| 红原县|