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

PostgreSQL Public 模式的風(fēng)險及安全遷移問題小結(jié)

 更新時間:2024年10月31日 14:45:17   作者:樺仔  
本文主要討論了PostgreSQL中public模式的問題和解決方案,public模式默認對所有用戶開放訪問權(quán)限,容易發(fā)生命名沖突,且難以維護和隔離,修改或刪除它可能導(dǎo)致擴展無法正常工作,為解決這問題,建議新建模式,將public模式下的所有業(yè)務(wù)對象遷移過去

問題起因

前幾天有群友在群里面咨詢

PG12,13,14,public模式是否可以刪除或改名?
因為這位群友的公司的PG規(guī)范做了修改,不讓使用public模式存放數(shù)據(jù),但是遺留問題沒辦法。

另外一位群友說到

你還真不好動public。擴展的插件的函數(shù)大多默認都在public 下。

PG中默認的public模式帶來的問題

  • 安全性問題

public 模式默認對所有數(shù)據(jù)庫用戶都開放訪問權(quán)限。換句話說,所有連接到數(shù)據(jù)庫的用戶默認都可以訪問 public 模式中的對象(除非你手動修改權(quán)限)。

  • 命名沖突

public 模式是所有用戶和所有擴展默認使用的模式,容易發(fā)生命名沖突。

  • 可維護性和隔離性

使用 public 模式進行業(yè)務(wù)操作會使數(shù)據(jù)庫的架構(gòu)設(shè)計顯得雜亂無章,隨著時間推移,尤其是在大型項目或多個項目共享數(shù)據(jù)庫時,public模式中的對象數(shù)量會急劇增加

  • 版本和擴展的兼容性問題

許多 PostgreSQL 擴展默認使用 public 模式,如果修改 public 模式或刪除它,可能會導(dǎo)致擴展無法正常工作

能否重命名 public 模式

我們能不能通過下面命令對public 模式名重命名 ?

ALTER SCHEMA public RENAME TO you_schema;

實際上重命名 public 模式是不推薦的做法,原因如下

  • 依賴性問題:許多擴展、插件和默認的 PostgreSQL 設(shè)置都假定 public 模式存在。如果直接修改 public 的名稱,會導(dǎo)致這些依賴出現(xiàn)問題。
  • 升級問題:未來如果 PostgreSQL 版本升級,系統(tǒng)或新安裝的擴展可能仍然依賴于 public 模式存在。

因此,最好的做法是保留 public 模式,但不在業(yè)務(wù)中使用它。

如何解決這個問題

實際上,我們可以使用遷移的方式,新建一個模式,然后把public模式下的所有業(yè)務(wù)對象遷移到新建模式下

具體步驟

第一步:創(chuàng)建新的模式

CREATE SCHEMA employee;

第二步:遷移所有對象:對表、視圖、函數(shù)、存儲過程等對象分別執(zhí)行 SET SCHEMA 操作,將它們從 public 模式遷移到 employee 模式。

遷移對象時小心依賴關(guān)系,如外鍵、索引、函數(shù)依賴等,遷移時需要確保這些依賴關(guān)系不被破壞

使用以下命令逐個遷移:

-- 遷移所有表
ALTER TABLE public.table_name SET SCHEMA employee;
-- 遷移所有視圖
ALTER VIEW public.view_name SET SCHEMA employee;
-- 遷移所有函數(shù)
ALTER FUNCTION public.function_name SET SCHEMA employee;
-- 遷移所有存儲過程
ALTER PROCEDURE public.procedure_name SET SCHEMA employee;

使用 SQL 動態(tài)語句和 PL/pgSQL 編寫一個循環(huán)來批量遷移 public 模式中的所有表、視圖、函數(shù)和存儲過程到 employee 模式。

DO $$ 
DECLARE
    obj record;
BEGIN
    -- 遷移所有表
    FOR obj IN
        SELECT tablename
        FROM pg_tables
        WHERE schemaname = 'public'
    LOOP
        EXECUTE format('ALTER TABLE public.%I SET SCHEMA employee;', obj.tablename);
    END LOOP;
    -- 遷移所有視圖
    FOR obj IN
        SELECT viewname
        FROM pg_views
        WHERE schemaname = 'public'
    LOOP
        EXECUTE format('ALTER VIEW public.%I SET SCHEMA employee;', obj.viewname);
    END LOOP;
    -- 遷移所有函數(shù)
    FOR obj IN
        SELECT routine_name, routine_schema
        FROM information_schema.routines
        WHERE specific_schema = 'public'
    LOOP
        EXECUTE format('ALTER FUNCTION public.%I() SET SCHEMA employee;', obj.routine_name);
    END LOOP;
    -- 遷移所有存儲過程
    FOR obj IN
        SELECT routine_name, routine_schema
        FROM information_schema.routines
        WHERE specific_schema = 'public' AND routine_type = 'PROCEDURE'
    LOOP
        EXECUTE format('ALTER PROCEDURE public.%I() SET SCHEMA employee;', obj.routine_name);
    END LOOP;
END $$;

第三步:設(shè)置 search_path 通過調(diào)整 search_path 讓數(shù)據(jù)庫默認使用 employee 模式。

search_path 的設(shè)置順序非常重要。

將 employee 模式放在前面,確保在業(yè)務(wù)操作時優(yōu)先查找 employee 模式的對象,而 public 作為備選模式保留(方便擴展和插件的使用)。

可以修改 PostgreSQL 的 postgresql.conf 文件,或者在會話級別設(shè)置 search_path:

SET search_path TO employee, public;

第四步:考慮擴展和插件

許多擴展和插件默認使用 public 模式,例如 PostGIS、pgcrypto 等。

為了避免問題,最好不要修改 public 模式,而是保持其作為擴展使用的默認模式。

為什么SQL Server 沒有這個問題

SQL Server 沒有像 PostgreSQL 那樣對 public 模式的強烈依賴,并且其設(shè)計理念與 PostgreSQL 的 public 模式存在一些關(guān)鍵區(qū)別。

  • 權(quán)限管理的不同

在 SQL Server 中,dbo 是默認的 schema,所有數(shù)據(jù)庫用戶默認情況下并不會擁有對 dbo 這個 schema 中對象的完全訪問權(quán)限。只有擁有 db_owner 角色的用戶才可以完全控制 dbo 這個 schema。

也就是說,除非用戶顯式授予對 dbo 中對象的訪問或修改權(quán)限,否則,普通用戶是不能隨意訪問或修改 dbo 這個 schema 下的對象的。

相比之下,PostgreSQL 的 public 這個 schema 在默認情況下是對所有用戶開放的。這意味著所有用戶都可以在 public 這個 schema 中創(chuàng)建對象,除非手動限制權(quán)限。

PostgreSQL的設(shè)計會增加意外權(quán)限授予和數(shù)據(jù)泄露的風(fēng)險,因此在 PostgreSQL 中有時需要避免使用 public schema。

  • 模式設(shè)計理念的不同

在 PostgreSQL 中,public schema 設(shè)計為一個所有用戶共享的默認命名空間,因此經(jīng)常發(fā)生命名沖突、權(quán)限管理不嚴等問題。

在 SQL Server 中,dbo 是為擁有數(shù)據(jù)庫完全控制權(quán)的用戶預(yù)留的默認命名空間,通常普通用戶和 DBA 可以自行創(chuàng)建自定義 schema 來組織和隔離各自的數(shù)據(jù)庫對象。

參考文章

https://sdwh.dev/posts/2021/03/SQL-Server-What-Is-dbo/

https://www.ibm.com/support/pages/microsoft-sql-server-tables-get-generated-dbo-schema

https://www.postgresql.org/docs/current/ddl-schemas.html

https://www.crunchydata.com/blog/be-ready-public-schema-changes-in-postgres-15

到此這篇關(guān)于PostgreSQL Public 模式的風(fēng)險以及安全遷移的文章就介紹到這了,更多相關(guān)PostgreSQL Public 模式遷移內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PostgreSQL使用執(zhí)行計劃的入門到實戰(zhàn)調(diào)優(yōu)指南

    PostgreSQL使用執(zhí)行計劃的入門到實戰(zhàn)調(diào)優(yōu)指南

    在數(shù)據(jù)庫性能優(yōu)化領(lǐng)域,執(zhí)行計劃(Execution?Plan)是開發(fā)者與數(shù)據(jù)庫優(yōu)化器對話的翻譯器,PostgreSQL的執(zhí)行計劃不僅揭示了SQL語句的執(zhí)行路徑,更通過成本估算、實際耗時等關(guān)鍵指標,,為性能瓶頸定位提供了科學(xué)依據(jù),本文將系統(tǒng)講解PostgreSQL執(zhí)行計劃的核心機制與調(diào)優(yōu)方法
    2026-01-01
  • Postgresql 數(shù)據(jù)庫權(quán)限功能的使用總結(jié)

    Postgresql 數(shù)據(jù)庫權(quán)限功能的使用總結(jié)

    這篇文章主要介紹了Postgresql 數(shù)據(jù)庫權(quán)限功能的使用總結(jié),具有很好的參考價值,對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • PostgreSQL?psql命令行的高效使用方法

    PostgreSQL?psql命令行的高效使用方法

    本文詳細介紹了psql的高效使用方法,涵蓋連接管理、元命令、SQL執(zhí)行、輸出格式、變量與腳本、歷史記錄、配置優(yōu)化、安全實踐等多個方面,旨在幫助讀者提升psql的使用效率,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Windows下PostgreSQL安裝圖解

    Windows下PostgreSQL安裝圖解

    這篇文章主要為大家介紹了如果在Windows下安裝PostgreSQL數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2013-11-11
  • PostgreSQL數(shù)據(jù)庫中如何保證LIKE語句的效率(推薦)

    PostgreSQL數(shù)據(jù)庫中如何保證LIKE語句的效率(推薦)

    這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫中如何保證LIKE語句的效率,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • PostgreSQL Partition Pruning(分區(qū)裁剪)的原理、應(yīng)用和性能優(yōu)化指南

    PostgreSQL Partition Pruning(分區(qū)裁剪)的原理、應(yīng)用和性能優(yōu)化指南

    本文深入探討PostgreSQL中Partition Pruning(分區(qū)裁剪)技術(shù)的實現(xiàn)原理、應(yīng)用場景和優(yōu)化方法,通過詳細解析分區(qū)裁剪的工作機制,結(jié)合范圍分區(qū)、列表分區(qū)和哈希分區(qū)的實際案例,展示如何有效利用這一優(yōu)化技術(shù)提升查詢性能,需要的朋友可以參考下
    2025-07-07
  • postgresql多選功能實現(xiàn)代碼

    postgresql多選功能實現(xiàn)代碼

    這篇文章主要介紹了postgresql多選功能實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • PostgreSQL行轉(zhuǎn)列的多種方法

    PostgreSQL行轉(zhuǎn)列的多種方法

    這篇文章主要介紹了PostgreSQL行轉(zhuǎn)列的多種方法,本文給大家分享三種方法,每種方法結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • PostgreSQL如何選擇合適的數(shù)據(jù)類型

    PostgreSQL如何選擇合適的數(shù)據(jù)類型

    本文詳細介紹了PostgreSQL中各種數(shù)據(jù)類型的特性、適用場景、潛在陷阱及最佳實踐,涵蓋了數(shù)值、字符、時間、布爾、枚舉、網(wǎng)絡(luò)、JSON、幾何、全文搜索、范圍、自定義類型等核心類別,并通過真實案例說明了數(shù)據(jù)類型選型的邏輯,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • 解決postgresql無法遠程訪問的情況

    解決postgresql無法遠程訪問的情況

    這篇文章主要介紹了解決postgresql無法遠程訪問的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論

嘉义市| 大方县| 丰城市| 迁西县| 托克托县| 都江堰市| 苗栗市| 光泽县| 岢岚县| 嘉兴市| 三都| 衡水市| 兴安盟| 安岳县| 东乡县| 凤台县| 兰州市| 海口市| 修水县| 阜平县| 稻城县| 广宁县| 松原市| 蒲城县| 电白县| 襄汾县| 修武县| 偏关县| 新干县| 永福县| 崇文区| 云南省| 平邑县| 泸定县| 靖远县| 丰县| 尼玛县| 太原市| 牡丹江市| 信宜市| 惠东县|