Có nên cài đặt các phần mở rộng vào lược đồ pg_catalog không?


Câu trả lời:


16

Không cài đặt tiện ích mở rộng cho pg_catalog(trừ khi đó là mặc định của chúng: rất ít tiện ích mở rộng được thiết kế theo cách đó), bởi vì bạn không bao giờ làm hỏng danh mục hệ thống . @Chris chứng minh một lý do tại sao. Co nhung nguoi khac.

Tuy nhiên, lược đồ "công khai" không có cách nào đặc biệt . Đó chỉ là lược đồ mặc định được cài đặt sẵn trong các bản phân phối tiêu chuẩn để chúng tôi có thể bắt đầu ngay lập tức. Một số quản trị viên DB hoàn toàn không sử dụng lược đồ "công khai", một số thậm chí xóa nó.

CREATE EXTENSIONkhông liên kết với lược đồ "công khai". Nó cài đặt vào lược đồ hiện tại trừ khi được hướng dẫn khác - ngoại trừ một số tiện ích mở rộng có lược đồ được đặt sẵn (như PGQ / Londiste ). Các tài liệu:

lược đồ tên

Tên của lược đồ để cài đặt các đối tượng của tiện ích mở rộng, với điều kiện là tiện ích mở rộng cho phép di chuyển nội dung của nó. Các lược đồ được đặt tên phải tồn tại. Nếu không được chỉ định và tệp điều khiển của tiện ích mở rộng cũng không chỉ định lược đồ, lược đồ tạo đối tượng mặc định hiện tại được sử dụng .

Hãy nhớ rằng chính phần mở rộng không được coi là nằm trong bất kỳ lược đồ nào: các phần mở rộng có tên không đủ tiêu chuẩn phải là toàn bộ cơ sở dữ liệu. Nhưng các đối tượng thuộc phần mở rộng có thể nằm trong lược đồ.

Nhấn mạnh đậm của tôi.
Quyết định cách quản lý người dùng, lược đồ và search_path:

Sau đó quyết định nơi cài đặt tiện ích mở rộng. Bạn có thể cài đặt vào bất kỳ lược đồ nào bạn chọn và đưa lược đồ đó vào mặc định search_pathcho tất cả người dùng hoặc chỉ dành cho một số hoặc không có người dùng nào (để tham chiếu đủ điều kiện được yêu cầu). Tất cả phụ thuộc vào những gì bạn muốn đạt được.
Dù bạn làm gì, hãy kiên định.

Tôi thích cài đặt các tiện ích mở rộng (cho phép nó) trong một lược đồ "tiện ích mở rộng" chuyên dụng, mà tôi đưa vào mặc định search_path sau "công khai" (và "$ user" - nếu bạn sử dụng nó). Giúp tách biệt rõ ràng các chức năng công cộng của riêng tôi và các đối tượng công cộng khác. Cài đặt của tôi trong postgresql.conf:

search_path = "$user",public,extensions

Hoặc là:

search_path = public,extensions

Và tôi cài đặt tiện ích mở rộng với:

CREATE EXTENSION some_extension SCHEMA extensions;

Một điều cần lưu ý: Bằng cách này, bạn có thể "ẩn" các đối tượng (không đủ tiêu chuẩn) trong extensionslược đồ phía sau các đối tượng cùng tên (và tham số) trong publiclược đồ.

Liên quan:


ok là plpgsqlphần mở rộng sau đó bằng cách nào đó là một ngoại lệ cho quy tắc này? Mỗi cài đặt tôi đã thấy có phần mở rộng này trong pg_catalog
zam6ak

@ zam6ak: Có, plpgsql là một trường hợp đặc biệt: Trích dẫn hướng dẫn :In PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
Erwin Brandstetter

1
Plv8 cũng tự cài đặt pg_catalog. (Nó sẽ báo lỗi nếu bạn cố gắng thay đổi.) Đây có phải là một tiêu chuẩn để cài đặt các phần mở rộng ngôn ngữ thủ tục cho các chức năng không?
jpmc26

6

Cài đặt tiện ích mở rộng vào pg_catalog, theo như tôi biết, không nên. Bạn nên sử dụng publiclược đồ mặc định , cũng search_paththeo mặc định.

Tại sao?

Ví dụ, tôi sẽ làm việc với pageinspectphần mở rộng mà tôi đã tạo trong publiclược đồ. Theo mặc định, tất cả các hàm đều có thể truy cập được đối với tất cả các lược đồ trong cơ sở dữ liệu nếu chúng nằm trong publiclược đồ.

Bây giờ, tôi thử di chuyển nó vào pg_cataloglược đồ, sử dụng

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

và nó hoạt động tốt

Nhưng...

Cố gắng di chuyển nó một lần nữa, trở lại publiclược đồ bằng cách sử dụng

ALTER EXTENSION pageinspect SET SCHEMA public;

và nó sẽ không cho phép nó, mang lại lỗi sau

ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000

À! Chà, không sao, nó sẽ không cho phép tôi di chuyển nó. Tôi chỉ có thể đưa nó trở lại vào publiclược đồ bằng cách thả nó và tạo lại, phải không? ...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

Được rồi, tốt lắm. Quay lại đúng vị trí của nó trong publiclược đồ và các hàm vẫn có thể truy cập được đối với tất cả các lược đồ trong cơ sở dữ liệu.

TL, DR; Chỉ cần sử dụng publiclược đồ mặc định cho các phần mở rộng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.