chế độ kèo bóng đá hom nay trongPostgreSQLđược triển khai bằng hệ thống quy tắc. Chế độ kèo bóng đá hom nay về cơ bản là một bảng trống (không có lưu trữ thực tế) vớiThay vào đó chọn do
kèo bóng đá hom nay. Thông thường, kèo bóng đá hom nay đó được đặt tên_return
. Vì vậy, một chế độ kèo bóng đá hom nay như
Tạo kèo bóng đá hom nay myView là chọn * từ mytab;
120Postgresql: Tài liệu: 17: 39.2. Lượt kèo bóng đá hom nay và hệ thống quy tắc77
Tạo bảng MyView (cùng danh sách cột như mytab
);
Tạo kèo bóng đá hom nay "_return" như trên chọn vào myView do thay thế
Chọn * từ mytab;
Mặc dù bạn thực sự không thể viết nó, vì các bảng không được phép cóON CHỌN
kèo bóng đá hom nay.
Chế độ kèo bóng đá hom nay cũng có thể có các loại kháclàm thay thế
kèo bóng đá hom nay, cho phépChèn
, Cập nhật
hoặcXóa
Các lệnh sẽ được thực hiện trên chế độ kèo bóng đá hom nay mặc dù thiếu lưu trữ cơ bản. Điều này được thảo luận thêm bên dưới, trongPhần 39.2.4.
Chọn
kèo bóng đá hom nay làm việc#kèo bóng đá hom nayON CHỌN
được áp dụng cho tất cả các truy vấn làm bước cuối cùng, ngay cả khi lệnh được đưa ra làChèn
, Cập nhật
hoặcXóa
. Và họ có các ngữ nghĩa khác nhau từ các kèo bóng đá hom nay trên các loại lệnh khác ở chỗ chúng sửa đổi cây truy vấn tại chỗ thay vì tạo một loại mới. Vì thếChọn
kèo bóng đá hom nay được mô tả đầu tiên.
Hiện tại, chỉ có thể có một hành động trong mộttrên Chọn
kèo bóng đá hom nay và nó phải là một điều vô điều kiệnChọn
Hành động đó làThay vào đó
. Hạn chế này được yêu cầu để làm cho các kèo bóng đá hom nay đủ an toàn để mở chúng cho người dùng thông thường và nó hạn chếON CHỌN
Quy tắc hành động như chế độ kèo bóng đá hom nay.
Các ví dụ cho chương này là hai chế độ kèo bóng đá hom nay tham gia thực hiện một số tính toán và lần lượt một số lượt kèo bóng đá hom nay sử dụng chúng. Một trong hai chế độ kèo bóng đá hom nay đầu tiên được tùy chỉnh sau bằng cách thêm quy tắc choChèn
, Cập nhật
vàXóa
14369_14726
Các bảng thực sự chúng ta cần trong hai mô tả hệ thống kèo bóng đá hom nay đầu tiên là:
Tạo bảng giày_data ( Văn bản Shoename, - Khóa chính Số nguyên Sh_avail, - Số cặp có sẵn văn bản slcolor, - màu dây giày ưa thích slminlen real, - chiều dài dây giày tối thiểu slmaxlen real, - chiều dài dây giày tối đa văn bản slunit - đơn vị chiều dài ); Tạo bảng Shoelace_Data ( Text SL_NAME, - Khóa chính Số nguyên SL_AVAIL, - Số cặp có sẵn SL_COLOR Text, - Màu sắc Shoelace sl_len real, - chiều dài dây giày SL_UNIT Text - Đơn vị chiều dài ); Tạo đơn vị bảng ( un_name văn bản, - khóa chính un_fact real - yếu tố chuyển đổi thành cm );
Như bạn có thể thấy, chúng đại diện cho dữ liệu cửa hàng giày.
Các chế độ kèo bóng đá hom nay được tạo là:
Tạo giày kèo bóng đá hom nay AS Chọn Sh.Shoename, sh.sh_avail, sh.slcolor, sh.slminlen, sh.slminlen * un.un_fact dưới dạng slminlen_cm, sh.slmaxlen, sh.slmaxlen * un.un_fact dưới dạng slmaxlen_cm, Sh.Slunit Từ giày_data sh, unit un Trong đó sh.slunit = un.un_name; Tạo Chế độ kèo bóng đá hom nay Shoelace như Chọn S.SL_NAME, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, S.SL_LEN * U.UN_FACT AS SL_LEN_CM Từ shoelace_data s, đơn vị u Trong đó s.sl_unit = u.un_name; Tạo kèo bóng đá hom nay giày_ready AS Chọn rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, ít nhất (rsh.sh_avail, rsl.sl_avail) là Total_avail Từ RSH giày, dây giày RSL WHERE RSL.SL_COLOR = RSH.SLCOLOR Và rsl.sl_len_cm = rsh.slminlen_cm Và rsl.sl_len_cm <= rsh.slmaxlen_cm;
TheTạo chế độ kèo bóng đá hom nay
lệnh choShoelace
kèo bóng đá hom nay (cái đơn giản nhất chúng tôi có) sẽ tạo ra một mối quan hệShoelace
và một mục nhập trongPG_REWRITE
Điều đó cho biết rằng có một kèo bóng đá hom nay viết lại phải được áp dụng bất cứ khi nào quan hệShoelace
được tham chiếu trong bảng phạm vi của một truy vấn. kèo bóng đá hom nay không có trình độ kèo bóng đá hom nay (được thảo luận sau, với khôngChọn
kèo bóng đá hom nay, kể từChọn
kèo bóng đá hom nay hiện không có chúng) và đó làThay vào đó
. Lưu ý rằng trình độ kèo bóng đá hom nay không giống như trình độ truy vấn. Hành động của kèo bóng đá hom nay của chúng tôi có trình độ truy vấn. Hành động của kèo bóng đá hom nay là một cây truy vấn là bản sao củaChọn
Câu lệnh trong lệnh tạo kèo bóng đá hom nay.
Hai mục bảng phạm vi bổ sung chomới
vàcũ
17783_17810PG_REWRITE
Mục nhập không quan tâm choChọn
kèo bóng đá hom nay.
Bây giờ chúng tôi dân cưĐơn vị
, giày_data
vàShoelace_data
và chạy một truy vấn đơn giản trên chế độ kèo bóng đá hom nay:
18152_19757
Đây là đơn giản nhấtChọn
Bạn có thể làm theo quan điểm của chúng tôi, vì vậy chúng tôi nhân cơ hội này để giải thích những điều cơ bản của các quy tắc kèo bóng đá hom nay. TheChọn * từ Shoelace
đã được trình phân tích cú pháp giải thích và tạo ra cây truy vấn:
Chọn Shoelace.SL_NAME, SHOELACE.SL_AVAIL, Shoelace.SL_Color, Shoelace.SL_LEN, Shoelace.SL_Unit, Shoelace.SL_LEN_CM Từ dây giày Shoelace;
Và điều này được đưa ra cho hệ thống quy tắc. Hệ thống quy tắc đi qua bảng phạm vi và kiểm tra kèo bóng đá hom nay có quy tắc cho bất kỳ mối quan hệ nào không. Khi xử lý mục nhập bảng phạm vi choShoelace
(người duy nhất cho đến bây giờ) nó tìm thấy_return
kèo bóng đá hom nay với cây truy vấn:
Chọn S.SL_NAME, S.SL_AVAIL, s.sl_color, s.sl_len, s.sl_unit, S.SL_LEN * U.UN_FACT AS SL_LEN_CM Từ Shoelace cũ, Shoelace Mới, shoelace_data s, đơn vị u Trong đó s.sl_unit = U.un_name;
Để mở rộng chế độ kèo bóng đá hom nay, người viết lại chỉ cần tạo một mục nhập bảng phạm vi con chứa cây truy vấn hành động của quy tắc và thay thế mục nhập phạm vi này cho mục nhập ban đầu tham chiếu chế độ kèo bóng đá hom nay. Cây truy vấn viết lại kết quả gần giống như khi bạn đã nhập:
21125_21526
Tuy nhiênShoelace cũ
vàShoelace mới
. Các mục này không tham gia trực tiếp vào truy vấn, vì chúng không được tham chiếu bởi Cây tham gia hoặc danh sách mục tiêu của Sub Tricer. Người viết lại sử dụng chúng để lưu trữ thông tin kiểm tra đặc quyền truy cập ban đầu có mặt trong mục nhập bảng phạm vi tham chiếu chế độ kèo bóng đá hom nay. Theo cách này, người thực thi vẫn sẽ kiểm tra kèo bóng đá hom nay người dùng có đặc quyền thích hợp để truy cập chế độ kèo bóng đá hom nay hay không, mặc dù không sử dụng trực tiếp chế độ kèo bóng đá hom nay trong truy vấn viết lại.
Đó là quy tắc đầu tiên được áp dụng. Hệ thống quy tắc sẽ tiếp tục kiểm tra các mục bảng phạm vi còn lại trong truy vấn hàng đầu (trong ví dụ này không còn nữa), và nó sẽ kiểm tra đệ quy các mục bảng trong phạm vi trong trình điều khiển con được thêm vào để kèo bóng đá hom nay bất kỳ chế độ kèo bóng đá hom nay tham chiếu nào của chúng. (Nhưng nó sẽ không mở rộngcũ
hoặcnew
- Nếu không, chúng ta sẽ có đệ quy vô hạn!) Trong ví dụ này, không có kèo bóng đá hom nay viết lại choShoelace_data
hoặcĐơn vị
, Vì vậy, việc viết lại đã hoàn tất và ở trên là kết quả cuối cùng được đưa ra cho người lập kế hoạch.
22796_23016
Chọn * từ giày_ready trong đó Total_avail = 2; Tên ShoenSy | sh_avail | SL_NAME | SL_AVAIL | Total_avail ----------+----------+----------+----------+------------- Sh1 | 2 | SL1 | 5 | 2 Sh3 | 4 | SL7 | 7 | 4 (2 hàng)
Đầu ra của trình phân tích cú pháp lần này là cây truy vấn:
23443_23641
kèo bóng đá hom nay đầu tiên được áp dụng sẽ là cái chogiày_ready
kèo bóng đá hom nay và nó dẫn đến cây truy vấn:
23815_24357
Tương tự, các kèo bóng đá hom nay chogiày
vàShoelace
được thay thế vào bảng phạm vi của truy vấn con, dẫn đến một cây truy vấn cuối cùng ba cấp:
24603_25868
Điều này có thể trông kém hiệu quả, nhưng người lập kế hoạch sẽ thu gọn điều này thành một cây truy vấn cấp độ đơn củakéo lênCác mục tiêu phụ, và sau đó nó sẽ lên kế hoạch cho các lần tham gia giống như chúng ta đã viết chúng ra theo cách thủ công. Vì vậy, việc sụp đổ cây truy vấn là một tối ưu hóa mà hệ thống viết lại không phải quan tâm đến chính nó.
Chọn
Câu#Hai chi tiết của cây truy vấn không được chạm vào trong mô tả các quy tắc kèo bóng đá hom nay ở trên. Đây là loại lệnh và mối quan hệ kết quả. Trên thực tế, loại lệnh không cần thiết theo các quy tắc kèo bóng đá hom nay, nhưng mối quan hệ kết quả có thể ảnh hưởng đến cách thức hoạt động của trình viết lại truy vấn, bởi vì cần phải thực hiện chăm sóc đặc biệt nếu quan hệ kết quả là quan điểm.
Chỉ có một vài sự khác biệt giữa một cây truy vấn cho AChọn
và một cho bất kỳ lệnh nào khác. Rõ ràng, họ có một loại lệnh khác và cho một lệnh không phải làChọn
, mối quan hệ kết quả chỉ vào mục bảng phạm vi nơi kết quả sẽ đi. Mọi thứ khác hoàn toàn giống nhau. Vì vậy, có hai bảngT1
vàT2
với các cộtA
vàB
27457_27500
Chọn T2.b từ T1, T2 trong đó t1.a = T2.a; CẬP NHẬT T1 Đặt B = T2.B từ T2 trong đó T1.A = T2.A;
gần như giống hệt nhau. Đặc biệt:
Các bảng phạm vi chứa các mục cho các bảngT1
vàT2
.
Danh sách mục tiêu chứa một biến chỉ vào cộtB
của mục nhập bảng phạm vi cho bảngT2
.
Biểu thức đủ điều kiện so sánh các cộtA
của cả hai mục bảng phạm vi cho bình đẳng.
Cây tham gia hiển thị sự kết nối đơn giản giữaT1
vàT2
.
Hậu quả là, cả hai cây truy vấn đều dẫn đến các kế hoạch thực hiện tương tự: cả hai đều tham gia trên hai bảng. ChoCập nhật
Các cột bị thiếu từT1
được thêm vào danh sách mục tiêu bởi người lập kế hoạch và cây truy vấn cuối cùng sẽ đọc là:
Cập nhật T1 Đặt A = T1.A, B = T2.B từ T2 trong đó T1.A = T2.A;
Và do đó, người thực thi chạy qua tham gia sẽ tạo chính xác cùng một kết quả được đặt như:
Chọn T1.A, T2.b từ T1, T2 trong đó T1.A = T2.A;
Nhưng có một chút vấn đề trongCập nhật
: Phần của kế hoạch thực thi thực hiện tham gia không quan tâm đến kết quả từ sự tham gia là gì. Nó chỉ tạo ra một tập hợp kết quả của các hàng. Thực tế là một làChọn
Lệnh và người kia làCập nhật
được xử lý cao hơn trong người thực thi, trong đó nó biết rằng đây là mộtCập nhật
và nó biết rằng kết quả này sẽ đi vào bảngT1
. Nhưng những hàng nào phải được thay thế bằng hàng mới?
Để giải kèo bóng đá hom nayết vấn đề này, một mục khác được thêm vào danh sách đích trongCập nhật
(và cả trongXóa
)CTID).Đây là cột hệ thống chứa số khối tệp và vị trí trong khối cho hàng. Biết bảng,CTIDcó thể được sử dụng để truy xuất hàng ban đầu củaT1
Để được cập nhật. Sau khi thêmCTIDĐến danh sách đích, truy vấn thực sự trông giống như:
Chọn T1.A, T2.B, T1.CTID từ T1, T2 trong đó T1.A = T2.A;
Bây giờ là một chi tiết khác củaPostgreSQLBước vào giai đoạn. Các hàng bảng cũ không được ghi đè và đây là lý do tại saorollback
là nhanh. Trong một30755_30763
, Hàng kết quả mới được chèn vào bảng (sau khi tướcCTID) và trong tiêu đề hàng của hàng cũ, màCTIDchỉ vào,CMAX
vàxmax
Các mục được đặt thành bộ đếm lệnh hiện tại và ID giao dịch hiện tại. Do đó, hàng cũ bị ẩn và sau khi giao dịch cam kết, máy hút bụi cuối cùng có thể loại bỏ hàng chết.
Biết tất cả những điều đó, chúng ta có thể chỉ cần áp dụng các quy tắc kèo bóng đá hom nay theo cùng một cách tương tự cho bất kỳ lệnh nào. Không có sự khác biệt.
Trên đây cho thấy cách hệ thống quy tắc kết hợp các định nghĩa kèo bóng đá hom nay vào cây truy vấn ban đầu. Trong ví dụ thứ hai, một đơn giản31851_31859
Từ một chế độ kèo bóng đá hom nay đã tạo ra một cây truy vấn cuối cùng là tham gia 4 bảng (Đơn vị
Đã được sử dụng hai lần với các tên khác nhau).
32017_32595PostgreSQLĐảm bảo rằng đây là tất cả thông tin có sẵn về truy vấn cho đến điểm đó.
Điều gì xảy ra nếu chế độ kèo bóng đá hom nay được đặt tên là mối quan hệ đích cho mộtChèn
, Cập nhật
, Xóa
hoặcMerge
33201_33391POSTGRESQLTuy nhiên, có thể hỗ trợ sự xuất hiện của việc cập nhật chế độ kèo bóng đá hom nay. Theo thứ tự độ phức tạp có kinh nghiệm của người dùng, đó là: tự động thay thế trong bảng cơ bản cho chế độ kèo bóng đá hom nay, thực hiện trình kích hoạt do người dùng xác định hoặc viết lại truy vấn theo quy tắc do người dùng xác định. Các tùy chọn này được thảo luận dưới đây.
33727_33901Chèn
, Cập nhật
, Xóa
hoặcHợp nhất
được áp dụng cho mối quan hệ cơ sở theo cách thích hợp. Lượt kèo bóng đá hom nayĐủ đơn giảnĐối với điều này được gọi làtự động cập nhật. Để biết thông tin chi tiết về các loại chế độ kèo bóng đá hom nay có thể được cập nhật tự động, kèo bóng đá hom nayTạo chế độ kèo bóng đá hom nay.
Ngoài ra, thao tác có thể được xử lý bởi người dùng cung cấpthay vì
Trigger trên chế độ kèo bóng đá hom nay (kèo bóng đá hom nayTạo Trigger). Viết lại hoạt động hơi khác nhau trong trường hợp này. VìChèn
, người viết lại không làm gì cả với chế độ kèo bóng đá hom nay, để lại nó là mối quan hệ kết quả cho truy vấn. VìCập nhật
, Xóa
vàhợp nhất
, vẫn cần phải mở rộng truy vấn kèo bóng đá hom nay để sản xuấtcũ”Các hàng mà lệnh sẽ cố gắng cập nhật, xóa hoặc hợp nhất. Vì vậy, chế độ kèo bóng đá hom nay được mở rộng như bình thường, nhưng một mục nhập bảng không bao giờ khác được thêm vào truy vấn để biểu diễn chế độ kèo bóng đá hom nay trong khả năng của nó là mối quan hệ kết quả.
Vấn đề hiện đang phát sinh là làm thế nào để xác định các hàng sẽ được cập nhật trong chế độ kèo bóng đá hom nay. Hãy nhớ lại rằng khi mối quan hệ kết quả là một bảng, một đặc biệtCTIDMục nhập được thêm vào danh sách mục tiêu để xác định các vị trí vật lý của các hàng sẽ được cập nhật. Điều này không hoạt động nếu mối quan hệ kết quả là một chế độ kèo bóng đá hom nay, bởi vì một chế độ kèo bóng đá hom nay không có bất kỳCTID, vì các hàng của nó không có vị trí vật lý thực tế. Thay vào đó, cho mộtCập nhật
, Xóa
hoặcMerge
Hoạt động, đặc biệtWholerow
Mục nhập được thêm vào danh sách đích, mở rộng để bao gồm tất cả các cột từ chế độ kèo bóng đá hom nay. Người thực thi sử dụng giá trị này để cung cấpcũHồihàng đếnthay vì
Trigger. Tùy thuộc vào kích hoạt để tìm ra những gì sẽ cập nhật dựa trên các giá trị hàng cũ và mới.
Khả năng khác là người dùng xác địnhThay vào đó
Các kèo bóng đá hom nay chỉ định các hành động thay thế choChèn
, Cập nhật
và36608_36616
lệnh trên chế độ kèo bóng đá hom nay. Các quy tắc này sẽ viết lại lệnh, thường là một lệnh cập nhật một hoặc nhiều bảng, thay vì kèo bóng đá hom nay. Đó là chủ đề củaPhần 39.4. Lưu ý rằng điều này sẽ không hoạt động vớiHợp nhất
, hiện không hỗ trợ các kèo bóng đá hom nay về mối quan hệ đích khác ngoàiChọn
kèo bóng đá hom nay.
Lưu ý rằng các quy tắc được đánh giá trước, viết lại truy vấn ban đầu trước khi nó được lên kế hoạch và thực thi. Do đó, nếu một chế độ kèo bóng đá hom nay cóthay vì
Trình kích hoạt cũng như các kèo bóng đá hom nay trênChèn
, Cập nhật
hoặcXóa
, thì các kèo bóng đá hom nay sẽ được đánh giá trước và tùy thuộc vào kết quả, các kích hoạt có thể không được sử dụng.
Viết lại tự động của mộtChèn
, Cập nhật
, Xóa
hoặcMerge
Truy vấn trên một chế độ kèo bóng đá hom nay đơn giản luôn được thử cuối cùng. Do đó, nếu một chế độ kèo bóng đá hom nay có quy tắc hoặc kích hoạt, chúng sẽ ghi đè hành vi mặc định của các chế độ kèo bóng đá hom nay có thể cập nhật tự động.
Nếu không cóThay vào đó
kèo bóng đá hom nay hoặcthay vì
37970_38172
Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không phù hợp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.