Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng kèo bóng đá pháp trang chohiện tạiPhiên bản hoặc một trong kèo bóng đá pháp phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

37.15. Bao bì các đối tượng liên quan đến một phần kèo bóng đá pháp

Một tiện ích kèo bóng đá pháp hữu ích choPostgreSQLthường bao gồm nhiều đối tượng SQL; Ví dụ: một loại dữ liệu mới sẽ yêu cầu kèo bóng đá pháp chức năng mới, toán tử mới và kèo bóng đá pháp lớp toán tử chỉ mục mới. Rất hữu ích khi thu thập tất cả kèo bóng đá pháp đối tượng này vào một gói duy nhất để đơn giản hóa quản lý cơ sở dữ liệu.PostgreSQLgọi kèo bóng đá pháp gói như vậykèo bóng đá pháp. Để xác định tiện ích kèo bóng đá pháp, bạn cần ít nhất mộtTập tin tập lệnhchứaSQLCác lệnh để tạo các đối tượng của tiện ích kèo bóng đá pháp và ATệp điều khiểnChỉ định một vài thuộc tính cơ bản của chính tiện ích kèo bóng đá pháp. Nếu tiện ích kèo bóng đá pháp bao gồm mã C, thông thường cũng sẽ có một tệp thư viện được chia sẻ mà mã C đã được xây dựng. Khi bạn có các tệp này, đơn giảnPostgreSQL: Tài liệu: 10: TạoLệnh tải kèo bóng đá pháp đối tượng vào cơ sở dữ liệu của bạn.

Ưu điểm chính của việc sử dụng tiện ích kèo bóng đá pháp, thay vì chỉ chạySQLtập lệnh để tải kèo bóng đá pháp loạtLooseĐối tượng vào cơ sở dữ liệu của bạn, đó làPostgreSQLSau đó sẽ hiểu rằng các đối tượng của phần kèo bóng đá pháp đi cùng nhau. Bạn có thể bỏ tất cả các đối tượng bằng mộtTiện ích kèo bóng đá phápLệnh (không cần duy trì riêngGỡ cài đặt12530_12533tập lệnh). Thậm chí hữu ích hơn,pg_dumpbiết rằng nó không nên đổ các đối tượng thành viên riêng lẻ của phần kèo bóng đá pháp - nó sẽ chỉ bao gồm mộtTạo tiện ích kèo bóng đá pháp12754_13054

PostgreSQL13103_13306Tạo hoặc thay thế chức năngĐối với kèo bóng đá pháp hàm), hãy nhớ rằng định nghĩa sửa đổi sẽ không bị bỏ qua bởipg_dump13481_13677Phần 37.15.3.) Trong các tình huống sản xuất, nói chung tốt hơn là tạo tập lệnh cập nhật kèo bóng đá pháp để thực hiện các thay đổi đối với các đối tượng thành viên kèo bóng đá pháp.

Tập lệnh kèo bóng đá pháp có thể đặt các đặc quyền trên các đối tượng là một phần của phần kèo bóng đá pháp, sử dụngGrantthu hồiCâu lệnh. Tập hợp kèo bóng đá pháp đặc quyền cuối cùng cho mỗi đối tượng (nếu có được đặt) sẽ được lưu trữ trongcách đọc kèo bóngDanh mục hệ thống. Khipg_dumpđược sử dụng,Tạo tiện ích kèo bóng đá phápLệnh sẽ được bao gồm trong bãi rác, theo sau là tập hợpGrantthu hồikèo bóng đá pháp câu lệnh cần thiết để đặt kèo bóng đá pháp đặc quyền trên kèo bóng đá pháp đối tượng thành những gì chúng tại thời điểm kết xuất được thực hiện.

PostgreSQLHiện không hỗ trợ các tập lệnh kèo bóng đá phápTạo chính sáchhoặcNhãn bảo mậtCâu lệnh. Chúng được dự kiến ​​sẽ được đặt sau khi tiện ích kèo bóng đá pháp đã được tạo ra. Tất cả các chính sách RLS và nhãn bảo mật trên các đối tượng kèo bóng đá pháp sẽ được bao gồm trong các bãi rác được tạo bởipg_dump.

Cơ chế kèo bóng đá pháp cũng có các quy định cho các tập lệnh sửa đổi bao bì để điều chỉnh các định nghĩa của các đối tượng SQL có trong một phần kèo bóng đá pháp. Ví dụ: nếu phiên bản 1.1 của phần kèo bóng đá pháp thêm một chức năng và thay đổi phần thân của chức năng khác so với 1.0, tác giả kèo bóng đá pháp có thể cung cấpCập nhật tập lệnhĐiều đó chỉ thực hiện hai thay đổi đó. TheCập nhật kèo bóng đá pháp thay đổiLệnh sau đó có thể được sử dụng để áp dụng các thay đổi này và theo dõi phiên bản kèo bóng đá pháp nào thực sự được cài đặt trong cơ sở dữ liệu nhất định.

Các loại đối tượng SQL có thể là thành viên của một phần kèo bóng đá pháp được hiển thị trong mô tả củaPostgreSQL: Tài cách đọc kèo. Đáng chú ý, các đối tượng có toàn bộ cụm cơ sở dữ liệu, chẳng hạn như cơ sở dữ liệu, vai trò và không gian bảng, không thể là thành viên kèo bóng đá pháp vì một tiện ích kèo bóng đá pháp chỉ được biết đến trong một cơ sở dữ liệu. . Một điểm quan trọng khác là các lược đồ có thể thuộc về các phần kèo bóng đá pháp, nhưng không phải là ngược lại: một phần kèo bóng đá pháp như vậy có tên không đủ tiêu chuẩn và không tồn tạitrongHồibất kỳ lược đồ nào. Tuy nhiên, các đối tượng thành viên của tiện ích kèo bóng đá pháp sẽ thuộc về các lược đồ bất cứ khi nào thích hợp cho các loại đối tượng của chúng. Nó có thể hoặc không phù hợp cho một phần kèo bóng đá pháp để sở hữu (các) đối tượng thành viên của nó ở bên trong.

Nếu tập lệnh của một phần kèo bóng đá pháp sẽ tạo bất kỳ đối tượng tạm thời nào (như bảng TEMP), các đối tượng đó được coi là thành viên kèo bóng đá pháp trong phần còn lại của phiên hiện tại, nhưng được tự động bỏ ở cuối phiên, như bất kỳ đối tượng tạm thời nào. Đây là một ngoại lệ đối với quy tắc mà các đối tượng thành viên kèo bóng đá pháp không thể bị loại bỏ mà không bỏ toàn bộ tiện ích kèo bóng đá pháp.

37.15.1. Tệp kèo bóng đá pháp

ThePostgreSQL: Tài liệu: 10: TạoLệnh dựa trên tệp điều khiển cho mỗi phần kèo bóng đá pháp, phải được đặt tên giống như phần kèo bóng đá pháp với hậu tố.controlvà phải được đặt trong cài đặtchia sẻ/kèo bóng đá phápThư mục. Cũng phải có ít nhất kèo bóng đá phápSQLTập tin tập lệnh, theo mẫu đặt tênkèo bóng đá pháp--phiên bản.sql(ví dụ,foo--1.0.sqlcho phiên bản1.0của phần kèo bóng đá phápfoo). Theo mặc định, (kèo bóng đá pháp) tệp tập lệnh cũng được đặt trongchia sẻ/kèo bóng đá phápThư mục; Nhưng tệp điều khiển có thể chỉ định một thư mục khác cho (kèo bóng đá pháp) tệp tập lệnh.

Định dạng tệp cho tệp điều khiển kèo bóng đá pháp giống như đối vớiPostgreSql.confTệp, cụ thể là danh sáchtham số_name = giá trịBài tập, một dòng. kèo bóng đá pháp dòng trống và nhận xét được giới thiệu bởi#được cho phép. Hãy chắc chắn trích dẫn bất kỳ giá trị nào không phải là kèo bóng đá pháp từ hoặc số.

Tệp điều khiển có thể đặt kèo bóng đá pháp tham số sau:

Thư mục(chuỗi)

Thư mục chứa tiện ích kèo bóng đá phápSQL19205_19301SharedirThư mục. Hành vi mặc định tương đương với chỉ địnhThư mục = 'kèo bóng đá pháp'.

default_version(chuỗi)

Phiên bản mặc định của tiện ích kèo bóng đá pháp (phiên bản sẽ được cài đặt nếu không có phiên bản nào được chỉ định trongTạo tiện ích kèo bóng đá pháp). Mặc dù điều này có thể được bỏ qua, điều đó sẽ dẫn đếnTạo tiện ích kèo bóng đá phápthất bại nếu khôngphiên bản19877_19935

bình luận(chuỗi)

Một bình luận (bất kỳ chuỗi nào) về phần kèo bóng đá pháp. Nhận xét được áp dụng khi ban đầu tạo một tiện ích kèo bóng đá pháp, nhưng không phải trong các bản cập nhật kèo bóng đá pháp (vì điều đó có thể ghi đè lên các nhận xét được thêm vào người dùng). Ngoài ra, nhận xét của tiện ích kèo bóng đá pháp có thể được đặt bằng cách viết mộtbình luậnLệnh trong tệp tập lệnh.

mã hóa(chuỗi)

Mã hóa bộ ký tự được sử dụng bởi (kèo bóng đá pháp) tệp tập lệnh. Điều này sẽ được chỉ định nếu kèo bóng đá pháp tệp tập lệnh chứa bất kỳ ký tự không ASCII nào. Nếu không, kèo bóng đá pháp tệp sẽ được giả định là trong mã hóa cơ sở dữ liệu.

module_pathname(chuỗi)

Giá trị của tham số này sẽ được thay thế cho mỗi lần xuất hiệnmodule_pathnameTrong (kèo bóng đá pháp) tệp tập lệnh. Nếu nó không được thiết lập, không có sự thay thế nào được thực hiện. Thông thường, điều này được đặt thành$ libdir/shared_l Library_namevà sau đómodule_pathnameđược sử dụng trongTạo chức năngkèo bóng đá pháp lệnh cho kèo bóng đá pháp hàm ngôn ngữ C, để kèo bóng đá pháp tệp tập lệnh không cần phải kết nối tên của thư viện được chia sẻ.

Yêu cầu(chuỗi)

21561_21637Yêu cầu = 'Foo, Bar'. Các tiện ích kèo bóng đá pháp đó phải được cài đặt trước khi có thể cài đặt cái này.

Superuser(Boolean)

Nếu tham số này làTRUE(là mặc định), chỉ các siêu người dùng mới có thể tạo tiện ích kèo bóng đá pháp hoặc cập nhật nó lên phiên bản mới. Nếu nó được đặt thànhSai, Chỉ cần kèo bóng đá pháp đặc quyền cần thiết để thực thi kèo bóng đá pháp lệnh trong tập lệnh cài đặt hoặc cập nhật.

Relocatable(Boolean)

Một tiện ích kèo bóng đá pháp làRelocatableNếu có thể di chuyển các đối tượng chứa của nó vào một lược đồ khác sau khi tạo ban đầu của phần kèo bóng đá pháp. Mặc định làSai, tức là, tiện ích kèo bóng đá pháp không thể định nghĩa lại. Nhìn thấyPhần 37.15.2Để biết thêm thông tin.

lược đồ(chuỗi)

Tham số này chỉ có thể được đặt cho các tiện ích kèo bóng đá pháp không thể phân phối. Nó buộc phần kèo bóng đá pháp được tải vào chính xác lược đồ được đặt tên chứ không phải bất kỳ thứ nào khác. Thelược đồTham số chỉ được tư vấn khi ban đầu tạo một phần kèo bóng đá pháp, không phải trong các bản cập nhật kèo bóng đá pháp. Nhìn thấyPhần 37.15.2Để biết thêm thông tin.

Ngoài tệp điều khiển chínhkèo bóng đá pháp.control, một tiện ích kèo bóng đá pháp có thể có các tệp điều khiển thứ cấp có tên trong kiểukèo bóng đá pháp--phiên bản.control. Nếu được cung cấp, chúng phải được đặt trong thư mục tập tin tập lệnh. Các tệp điều khiển thứ cấp tuân theo định dạng giống như tệp điều khiển chính. Bất kỳ tham số nào được đặt trong tệp điều khiển thứ cấp ghi đè tệp điều khiển chính khi cài đặt hoặc cập nhật phiên bản kèo bóng đá pháp đó. Tuy nhiên, các tham sốThư mụcdefault_versionKhông thể được đặt trong tệp điều khiển phụ.

Một tiện ích kèo bóng đá phápSQLTập tin tập lệnh có thể chứa bất kỳ lệnh SQL nào, ngoại trừ kèo bóng đá pháp lệnh điều khiển giao dịch (bắt đầu, cam kết, v.v.) và kèo bóng đá pháp lệnh không thể được thực thi bên trong một khối giao dịch (chẳng hạn nhưVACUUM). Điều này là do kèo bóng đá pháp tệp tập lệnh được thực thi hoàn toàn trong một khối giao dịch.

Một tiện ích kèo bóng đá phápSQLTập tin tập lệnh cũng có thể chứa kèo bóng đá pháp dòng bắt đầu bằng\ echo, sẽ bị bỏ qua (được coi là bình luận) bằng cơ chế kèo bóng đá pháp. Điều khoản này thường được sử dụng để ném lỗi nếu tệp tập lệnh được đưa vàoPSQLthay vì được tải quaTạo tiện ích kèo bóng đá pháp(Xem ví dụ tập lệnh trongPhần 37.15.725126_25203HồiLooseĐối tượng chứ không phải là một phần kèo bóng đá pháp, một trạng thái có một chút tẻ nhạt để phục hồi từ.

Trong khi kèo bóng đá pháp tệp tập lệnh có thể chứa bất kỳ ký tự nào được cho phép bởi mã hóa được chỉ định, kèo bóng đá pháp tệp điều khiển chỉ chứa ASCII đơn giản, vì không có cách nào choPostgreSQL25567_25781bình luậntham số, nhưng thay vào đó sử dụngNhận xét về tiện ích kèo bóng đá phápTrong kèo bóng đá pháp tệp tập lệnh để đặt nhận xét.

37.15.2. Khả năng chuyển tiếp kèo bóng đá pháp

Người dùng thường muốn tải các đối tượng có trong một phần kèo bóng đá pháp vào một lược đồ khác với tác giả của tiện ích kèo bóng đá pháp. Có ba cấp độ được hỗ trợ của khả năng chuyển hóa:

  • Một tiện ích kèo bóng đá pháp hoàn toàn có thể chuyển sang một lược đồ khác bất cứ lúc nào, ngay cả sau khi nó được tải vào cơ sở dữ liệu. Điều này được thực hiện vớiThay đổi Lược đồ bộ kèo bóng đá phápLệnh, tự động đổi tên tất cả các đối tượng thành viên thành lược đồ mới. Thông thường, điều này chỉ có thể nếu phần kèo bóng đá pháp không có giả định nội bộ về lược đồ nào trong bất kỳ đối tượng nào của nó. Ngoài ra, tất cả các đối tượng của tiện ích kèo bóng đá pháp phải nằm trong một lược đồ để bắt đầu (bỏ qua các đối tượng không thuộc về bất kỳ lược đồ nào, chẳng hạn như ngôn ngữ thủ tục). Đánh dấu tiện ích kèo bóng đá pháp hoàn toàn có thể di dời bằng cách cài đặtRelocatable = trueTrong tệp điều khiển của nó.

  • Một tiện ích kèo bóng đá pháp có thể được chuyển vị trong quá trình cài đặt nhưng không phải sau đó. Đây thường là trường hợp nếu tệp tập lệnh của tiện ích kèo bóng đá pháp cần tham khảo lược đồ đích một cách rõ ràng, ví dụ trong cài đặtsearch_pathThuộc tính cho các hàm SQL. Đối với một tiện ích kèo bóng đá pháp như vậy, đặtRelocatable = falseTrong tệp điều khiển của nó và sử dụng@extschema@Để tham khảo lược đồ đích trong tệp tập lệnh. Tất cả kèo bóng đá pháp lần xuất hiện của chuỗi này sẽ được thay thế bằng tên của lược đồ mục tiêu thực tế trước khi tập lệnh được thực thi. Người dùng có thể đặt lược đồ đích bằng cách sử dụnglược đồTùy chọnTạo tiện ích kèo bóng đá pháp.

  • Nếu tiện ích kèo bóng đá pháp hoàn toàn không hỗ trợ di dời, SETRelocatable = falseTrong tệp điều khiển của nó và cũng được đặtlược đồvới tên của lược đồ mục tiêu dự định. Điều này sẽ ngăn chặn việc sử dụnglược đồTùy chọnTạo tiện ích kèo bóng đá pháp, trừ khi nó chỉ định cùng một lược đồ có tên trong tệp điều khiển. Lựa chọn này thường là cần thiết nếu tiện ích kèo bóng đá pháp chứa các giả định nội bộ về các tên lược đồ không thể thay thế bằng cách sử dụng@extschema@. The@extschema@Cơ chế thay thế cũng có sẵn trong trường hợp này, mặc dù nó được sử dụng hạn chế vì tên lược đồ được xác định bởi tệp điều khiển.

Trong mọi trường hợp, tệp tập lệnh sẽ được thực thi bằngsearch_pathBan đầu được đặt để trỏ đến lược đồ đích; đó là,Tạo tiện ích kèo bóng đá phápCó tương đương với điều này không:

Đặt Local Search_path thành @extschema @, pg_temp;

Điều này cho phép kèo bóng đá pháp đối tượng được tạo bởi tệp tập lệnh đi vào lược đồ đích. Tệp tập lệnh có thể thay đổisearch_pathNếu nó muốn, nhưng điều đó thường không mong muốn.search_pathĐược khôi phục về cài đặt trước đó sau khi hoàn thànhTạo tiện ích kèo bóng đá pháp.

lược đồ đích được xác định bởilược đồ29448_29516lược đồTùy chọnTạo tiện ích kèo bóng đá phápNếu điều đó được đưa ra, nếu không thì lược đồ tạo đối tượng mặc định hiện tại (cái đầu tiên trong người gọisearch_path). Khi tệp điều khiểnSchemaTham số được sử dụng, lược đồ đích sẽ được tạo nếu nó không tồn tại, nhưng trong hai trường hợp còn lại, nó phải tồn tại.

Nếu có bất kỳ tiện ích kèo bóng đá pháp điều kiện tiên quyết nào được liệt kê trongYêu cầuTrong tệp điều khiển, kèo bóng đá pháp lược đồ mục tiêu của chúng được thêm vào cài đặt ban đầu củasearch_path, theo lược đồ mục tiêu của tiện ích kèo bóng đá pháp mới. Điều này cho phép các đối tượng của chúng được hiển thị với tệp tập lệnh của tiện ích kèo bóng đá pháp mới.

cho bảo mật,PG_TEMPđược tự động nối vào cuốisearch_pathTrong mọi trường hợp.

Mặc dù phần kèo bóng đá pháp không thể phân phối có thể chứa các đối tượng trải đều trên nhiều lược đồ, nhưng thường mong muốn đặt tất cả các đối tượng có nghĩa là sử dụng bên ngoài vào một lược đồ, được coi là lược đồ mục tiêu của tiện ích kèo bóng đá pháp. Sự sắp xếp như vậy hoạt động thuận tiện với cài đặt mặc định củasearch_pathTrong khi tạo ra các tiện ích kèo bóng đá pháp phụ thuộc.

37.15.3. Bảng cấu hình kèo bóng đá pháp

31011_31271pg_dump31309_31502

Để giải quyết vấn đề này, tệp tập lệnh của tiện ích kèo bóng đá pháp có thể đánh dấu bảng hoặc một chuỗi nó đã tạo thành mối quan hệ cấu hình, sẽ gây raPG_DUMPbao gồm kèo bóng đá pháp nội dung của bảng hoặc chuỗi (không phải định nghĩa của nó) trong kèo bóng đá pháp bãi rác. Để làm điều đó, hãy gọi chức năngpg_extension_config_dump (regclass, văn bản)Sau khi tạo bảng hoặc chuỗi, ví dụ

Tạo bảng my_config (văn bản chính, văn bản giá trị);
Tạo chuỗi my_config_seq;

Chọn pg_catalog.pg_extension_config_dump ('my_config', '');
Chọn pg_catalog.pg_extension_config_dump ('my_config_seq', '');;

Bất kỳ số lượng bảng hoặc chuỗi nào cũng có thể được đánh dấu theo cách này. Trình tự được liên kết vớisê -rihoặcBigSerialkèo bóng đá pháp cột cũng có thể được đánh dấu.

Khi đối số thứ hai củapg_extension_config_dumplà kèo bóng đá pháp chuỗi trống, toàn bộ nội dung của bảng được đổ bởipg_dump. Điều này thường chỉ đúng nếu bảng ban đầu trống như được tạo bởi tập lệnh kèo bóng đá pháp. Nếu có hỗn hợp dữ liệu ban đầu và dữ liệu do người dùng cung cấp trong bảng, thì đối số thứ hai củapg_extension_config_dumpCung cấp AWHEREĐiều kiện chọn dữ liệu sẽ được bỏ. Ví dụ: bạn có thể làm

Tạo bảng my_config (văn bản chính, văn bản giá trị, standard_entry boolean);

Chọn pg_catalog.pg_extension_config_dump ('my_config', 'trong đó không tiêu chuẩn_entry');

và sau đó đảm bảo rằngStandard_entrychỉ đúng trong các hàng được tạo bởi tập lệnh của tiện ích kèo bóng đá pháp.

Đối với kèo bóng đá pháp chuỗi, đối số thứ hai củapg_extension_config_dumpkhông có hiệu lực.

kèo bóng đá pháp tình huống phức tạp hơn, chẳng hạn như kèo bóng đá pháp hàng được cung cấp ban đầu có thể được sửa đổi bởi người dùng, có thể được xử lý bằng cách tạo kèo bóng đá pháp trình kích hoạt trên bảng cấu hình để đảm bảo rằng kèo bóng đá pháp hàng được sửa đổi được đánh dấu chính xác.

Bạn có thể thay đổi điều kiện bộ lọc được liên kết với bảng cấu hình bằng cách gọipg_extension_config_dumpkèo bóng đá pháp lần nữa. .34006_34038.

Lưu ý rằng mối quan hệ khóa nước ngoài giữa các bảng này sẽ ra lệnh cho thứ tự mà các bảng bị bỏ qua bởi PG_DUMP. Cụ thể, PG_DUMP sẽ cố gắng kết xuất bảng được tham chiếu trước bảng tham chiếu. Vì các mối quan hệ khóa nước ngoài được thiết lập tại Tạo thời gian kèo bóng đá pháp (trước khi dữ liệu được tải vào các bảng) Các phụ thuộc tròn không được hỗ trợ. Khi tồn tại các phụ thuộc tròn, dữ liệu vẫn sẽ được bỏ ra nhưng bãi rác sẽ không thể được khôi phục trực tiếp và cần có sự can thiệp của người dùng.

34600_34628sê -rihoặcBigSerial34697_34817

37.15.4. Cập nhật tiện ích kèo bóng đá pháp

34982_35384Cập nhật tập lệnhĐiều đó thực hiện kèo bóng đá pháp thay đổi cần thiết để đi từ phiên bản này sang phiên bản tiếp theo. Cập nhật tập lệnh có tên theo mẫukèo bóng đá pháp--Old_Version--Target_Version.sql(ví dụ:35774_35793Chứa kèo bóng đá pháp lệnh để sửa đổi phiên bản1.0của phần kèo bóng đá phápfoothành phiên bản1.1).

Cho rằng tập lệnh cập nhật phù hợp có sẵn, lệnhCập nhật kèo bóng đá pháp thay đổisẽ cập nhật tiện ích kèo bóng đá pháp được cài đặt cho phiên bản mới được chỉ định. Tập lệnh cập nhật được chạy trong cùng một môi trườngTạo tiện ích kèo bóng đá phápCung cấp kèo bóng đá pháp tập lệnh cài đặt: Đặc biệt,search_pathđược thiết lập theo cùng một cách và bất kỳ đối tượng mới nào được tạo bởi tập lệnh đều được tự động thêm vào phần kèo bóng đá pháp. Ngoài ra, nếu tập lệnh chọn bỏ các đối tượng thành viên kèo bóng đá pháp, chúng sẽ tự động phân tách khỏi phần kèo bóng đá pháp.

36578_36743

36749_3683336851_36854LooseBộ sưu tập các đối tượng thành một phần kèo bóng đá pháp. Trước khi cơ chế kèo bóng đá pháp được thêm vàoPostgreSQL(Trong 9.1), nhiều người đã viết các mô -đun kèo bóng đá pháp chỉ đơn giản là tạo các đối tượng chưa đóng gói. Cho một cơ sở dữ liệu hiện có chứa các đối tượng như vậy, làm thế nào chúng ta có thể chuyển đổi các đối tượng thành một tiện ích kèo bóng đá pháp được đóng gói đúng? Bỏ chúng và sau đó làm một đơn giảnTạo tiện ích kèo bóng đá pháplà một cách, nhưng không mong muốn nếu các đối tượng có sự phụ thuộc (ví dụ: nếu có các cột bảng của một loại dữ liệu được tạo bởi phần kèo bóng đá pháp). Cách khắc phục tình huống này là tạo một phần kèo bóng đá pháp trống, sau đó sử dụngÍt kèo bóng đá pháp thay đổi37590_37764Tạo tiện ích kèo bóng đá phápHỗ trợ trường hợp này vớitừ Old_VersionTùy chọn, điều này khiến nó không chạy tập lệnh cài đặt thông thường cho phiên bản đích, mà thay vào đó là tập lệnh cập nhật có tênkèo bóng đá pháp--Old_Version--Target_Version.sql. Sự lựa chọn của tên phiên bản giả sẽ sử dụng là38326_38339Tùy thuộc vào tác giả kèo bóng đá pháp, mặc dùGiải nénlà một quy ước chung. Nếu bạn có nhiều phiên bản trước, bạn cần có khả năng cập nhật thành kiểu kèo bóng đá pháp, hãy sử dụng nhiều tên phiên bản giả để xác định chúng.

kèo bóng đá pháp thay đổi38642_38749foo--1.0--1.1.sqlfoo--1.1--2.0.sqlCó sẵn,kèo bóng đá pháp thay đổisẽ áp dụng chúng theo trình tự nếu bản cập nhật lên phiên bản2.0được yêu cầu khi1.0hiện đang được cài đặt.

PostgreSQLKhông giả sử bất cứ điều gì về kèo bóng đá pháp thuộc tính của tên phiên bản: Ví dụ: không biết liệu1.1theo sau1.0. Nó chỉ khớp với kèo bóng đá pháp tên phiên bản có sẵn và đi theo đường dẫn yêu cầu áp dụng kèo bóng đá pháp tập lệnh cập nhật ít nhất. (Tên phiên bản thực sự có thể là bất kỳ chuỗi nào không chứa--hoặc dẫn đầu hoặc theo dõi-.)

Đôi khi rất hữu ích khi cung cấphạ cấpSCRIPTS, ví dụfoo--1.1--1.0.sqlĐể cho phép hoàn nguyên kèo bóng đá pháp thay đổi liên quan đến phiên bản1.1. Nếu bạn làm điều đó, hãy cẩn thận với khả năng kèo bóng đá pháp tập lệnh hạ cấp có thể được áp dụng bất ngờ vì nó mang lại kèo bóng đá pháp đường dẫn ngắn hơn. Trường hợp rủi ro là nơi cóHồiĐường dẫn nhanhCập nhật tập lệnh nhảy về phía trước kèo bóng đá pháp số phiên bản cũng như tập lệnh hạ cấp xuống điểm bắt đầu của đường dẫn nhanh. Có thể thực hiện ít bước hơn để áp dụng hạ cấp và sau đó là đường dẫn nhanh hơn là di chuyển về phía trước kèo bóng đá pháp phiên bản tại kèo bóng đá pháp thời điểm. Nếu tập lệnh hạ cấp giảm bất kỳ đối tượng không thể thay thế nào, điều này sẽ mang lại kết quả không mong muốn.

Để kiểm tra kèo bóng đá pháp đường dẫn cập nhật không mong muốn, hãy sử dụng lệnh này:

Chọn * từ pg_extension_update_paths ('extension_name');

40585_40785nullNếu không có đường dẫn cập nhật có sẵn. Đường dẫn được hiển thị ở dạng văn bản với--Dấu tách. Bạn có thể sử dụngregexp_split_to_array (đường dẫn, '-')Nếu bạn thích định dạng mảng.

37.15.5. Cài đặt tiện ích kèo bóng đá pháp bằng cách sử dụng tập lệnh cập nhật

41234_41414fooPhần kèo bóng đá pháp trong các phiên bản1.0, 1.11.2, Cần có kèo bóng đá pháp tập lệnh cập nhậtfoo--1.0--1.1.sqlfoo--1.1--1.2.sql. TrướcPostgreSQL10, cũng cần phải tạo kèo bóng đá pháp tệp tập lệnh mớifoo--1.1.sqlfoo--1.2.sqlxây dựng trực tiếp các phiên bản kèo bóng đá pháp mới hơn hoặc các phiên bản mới hơn không thể được cài đặt trực tiếp, chỉ bằng cách cài đặt1.0Và sau đó cập nhật. Đó là tẻ nhạt và trùng lặp, nhưng bây giờ nó không cần thiết, bởi vìTạo tiện ích kèo bóng đá phápCó thể tự động theo chuỗi cập nhật. Ví dụ: nếu chỉ kèo bóng đá pháp tệp tập lệnhfoo--1.0.sql, foo--1.0--1.1.sqlfoo--1.1--1.2.sqlCó sẵn sau đó yêu cầu cài đặt phiên bản1.2được vinh danh bằng cách chạy ba tập lệnh đó theo trình tự. Việc xử lý giống như khi bạn đã cài đặt lần đầu tiên1.0và sau đó được cập nhật lên1.2. (Như vớiCập nhật kèo bóng đá pháp thay đổi, Nếu có sẵn nhiều con đường thì ngắn nhất được ưu tiên.) Sắp xếp các tệp tập lệnh của một tiện ích kèo bóng đá pháp theo kiểu này có thể làm giảm lượng nỗ lực bảo trì cần thiết để tạo ra các bản cập nhật nhỏ.

Nếu bạn sử dụng các tệp điều khiển thứ cấp (cụ thể phiên bản) với tiện ích kèo bóng đá pháp được duy trì theo kiểu này, hãy nhớ rằng mỗi phiên bản cần một tệp điều khiển ngay cả khi nó không có tập lệnh cài đặt độc lập, vì tệp điều khiển đó sẽ xác định cách thức cập nhật ngầm vào phiên bản đó. Ví dụ: nếufoo--1.0.ControlChỉ địnhYêu cầu = 'Bar'nhưngfooCác tệp điều khiển khác không, sự phụ thuộc của tiện ích kèo bóng đá pháp vàoBarsẽ bị loại bỏ khi cập nhật từ1.0sang phiên bản khác.

37.15.6. Cân nhắc bảo mật cho các tiện ích kèo bóng đá pháp

Các tiện ích kèo bóng đá pháp được phân phối rộng rãi nên giả định rất ít về cơ sở dữ liệu mà chúng chiếm. Do đó, việc viết các chức năng được cung cấp bởi một tiện ích kèo bóng đá pháp theo kiểu an toàn không thể bị xâm phạm bởi các cuộc tấn công dựa trên đường dẫn.

Một tiện ích kèo bóng đá pháp cóSuperuserThuộc tính được đặt thành True cũng phải xem xét các mối nguy hiểm bảo mật cho các hành động được thực hiện trong các tập lệnh cài đặt và cập nhật. Một người dùng độc hại không khó để tạo ra các đối tượng Trojan-Horse sẽ thỏa hiệp sau đó việc thực hiện một tập lệnh kèo bóng đá pháp được viết bất cẩn, cho phép người dùng đó có được các đặc quyền Superuser.

Lời khuyên về việc viết kèo bóng đá pháp chức năng được cung cấp một cách an toàn trongPhần 37.15.6.1bên dưới và lời khuyên về việc viết tập lệnh cài đặt được cung cấp kèo bóng đá pháp cách an toàn trongPhần 37.15.6.2.

37.15.6.1. Cân nhắc bảo mật cho các chức năng kèo bóng đá pháp

45130_45335

TheTạo chức năngTrang tham khảo chứa lời khuyên về viếtbảo mật xác địnhchức năng an toàn. Đó là thực tế tốt để áp dụng các kỹ thuật đó cho bất kỳ chức năng nào được cung cấp bởi một tiện ích kèo bóng đá pháp, vì chức năng có thể được gọi bởi người dùng đặc quyền cao.

Nếu bạn không thể đặtsearch_pathĐể chỉ chứa kèo bóng đá pháp lược đồ an toàn, giả sử rằng mỗi tên không đủ tiêu chuẩn có thể giải quyết cho một đối tượng mà người dùng độc hại đã xác định. Cảnh giác với kèo bóng đá pháp cấu trúc phụ thuộc vàosearch_pathngầm; Ví dụ,46097_46101caseBiểu thứcKhiLuôn chọn toán tử bằng đường dẫn tìm kiếm. Ở vị trí của họ, sử dụngtoán tử (lược đồ. =) Bất kỳtrường hợp khiBiểu thức.

Một tiện ích kèo bóng đá pháp có mục đích chung thường không nên cho rằng nó được cài đặt vào một lược đồ an toàn, điều đó có nghĩa là ngay cả các tham chiếu đủ điều kiện lược đồ đối với các đối tượng của nó không hoàn toàn không có rủi ro. Ví dụ: nếu tiện ích kèo bóng đá pháp đã xác định chức năngmyschema.myfunc (bigint)Sau đó, kèo bóng đá pháp cuộc gọi nhưmyschema.myfunc (42)Có thể bị bắt bởi chức năng thù địchmyschema.myfunc (integer). Hãy cẩn thận rằng kèo bóng đá pháp loại dữ liệu của kèo bóng đá pháp tham số chức năng và toán tử khớp chính xác với kèo bóng đá pháp loại đối số được khai báo, sử dụng kèo bóng đá pháp diễn viên rõ ràng khi cần thiết.

37.15.6.2. Cân nhắc bảo mật cho các tập lệnh kèo bóng đá pháp

Cài đặt kèo bóng đá pháp hoặc tập lệnh cập nhật nên được viết để bảo vệ chống lại các cuộc tấn công dựa trên đường dẫn xuất hiện khi tập lệnh thực thi. Nếu một tham chiếu đối tượng trong tập lệnh có thể được thực hiện để giải quyết cho một số đối tượng khác ngoài ý định của tác giả tập lệnh, thì một sự thỏa hiệp có thể xảy ra ngay lập tức hoặc sau đó khi sử dụng đối tượng kèo bóng đá pháp được xác định sai.

kèo bóng đá pháp lệnh DDL nhưTạo chức năngTạo lớp toán tửthường an toàn, nhưng hãy cẩn thận với bất kỳ lệnh nào có biểu thức mục đích chung như kèo bóng đá pháp thành phần. Ví dụ,Tạo chế độ xemCần được xem xét, cũng nhưMặc địnhBiểu thức trongTạo chức năng.

48071_48266search_path; LÀMkhôngTin tưởng đường dẫn được cung cấp bởiTạo/thay đổi tiện ích kèo bóng đá phápĐể được bảo mật. Thực hành tốt nhất là đặt tạm thờisearch_pathđến'pg_catalog, pg_temp'và chèn tham chiếu vào lược đồ cài đặt của tiện ích kèo bóng đá pháp một cách rõ ràng khi cần thiết. (Thực hành này cũng có thể hữu ích cho việc tạo chế độ xem.) Các ví dụ có thể được tìm thấy trongĐóng gópMô -đun trongPostgreSQLPhân phối mã nguồn.

Tài liệu tham khảo kèo bóng đá pháp chéo cực kỳ khó khăn để đảm bảo hoàn toàn, một phần vì sự không chắc chắn về lược đồ nào khác nhau.search_path. Tuy nhiên, hiện tại không có cơ chế nào tồn tại để yêu cầu điều đó.

37.15.7. Ví dụ tiện ích kèo bóng đá pháp

Đây là kèo bóng đá pháp ví dụ hoàn chỉnh vềSQL49567_49678KHàngV. kèo bóng đá pháp giá trị không theo văn bản được tự động ép buộc vào văn bản để lưu trữ.

Tệp tập lệnhcặp-1.0.sqlTrông như thế này:

- Khiếu nại nếu tập lệnh có nguồn gốc trong PSQL, thay vì thông qua Tạo tiện ích kèo bóng đá pháp
\ Echo Sử dụng "Tạo cặp kèo bóng đá pháp" để tải tệp này. \từ bỏ

Tạo cặp loại như (k văn bản, văn bản V);

Tạo cặp chức năng (văn bản, văn bản)
Trả về cặp ngôn ngữ sql là 'chọn hàng ($ 1, $ 2) ::@extschema@.pair;';

Tạo toán tử ~ (leftarg = text, rightarg = text, thủ tục = cặp);

- "Đặt search_path" rất dễ nhận được, nhưng tên đủ điều kiện hoạt động tốt hơn.
Tạo chức năng thấp hơn (cặp)
Trả về cặp ngôn ngữ SQL
Như 'Chọn hàng (thấp hơn ($ 1.K), thấp hơn ($ 1.V)) ::@extschema@.pair;'
Đặt search_path = pg_temp;

Tạo chức năng cặp_concat (cặp, cặp)
Trả về cặp ngôn ngữ SQL
Như 'Chọn hàng (toán tử $ 1.K (pg_catalog. ||) $ 2.K,
               Nhà điều hành $ 1.V (pg_catalog. ||) $ 2.V) ::@extschema@.pair; ';

Tệp điều khiểnPair.ControlTrông như thế này:

# Phần kèo bóng đá pháp cặp
Nhận xét = 'Kiểu dữ liệu cặp khóa/giá trị'
default_version = '1.0'
# Không thể di dời vì sử dụng @extschema @
có thể di dời = false

Trong khi bạn hầu như không cần kèo bóng đá pháp makefile để cài đặt hai tệp này vào thư mục chính xác, bạn có thể sử dụngMakefileChứa này:

Texts = Pair
Dữ liệu = cặp-- 1.0.sql

Pg_config = pg_config
Pgxs: = $ (shell $ (pg_config) -pgxs)
Bao gồm $ (PGXS)

Makefile này dựa trênPGXS, được mô tả trongPhần 37.16. LệnhTạo cài đặtSẽ cài đặt kèo bóng đá pháp tệp điều khiển và tập lệnh vào thư mục chính xác như được báo cáo bởipg_config.

Sau khi cài đặt kèo bóng đá pháp tệp, hãy sử dụngPostgreSQL: Tài liệu: 10: TạoLệnh tải kèo bóng đá pháp đối tượng vào bất kỳ cơ sở dữ liệu cụ thể nào.