PostgreSQL: Tài liệu: 1SL4 |: SL4 |1.2. Lượt xe100 và hệ thống quy tắc <100eta na100e="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <100eta http-equiv="Content-Type" content="text/xht100l; charset=utf-8" /> <100eta na100e="the100e-color" content="#336491"/> <100eta na100e="copyright" content="The PostgreSQL Global Develop100ent Group" /> <100eta property="og:url" content="/docs/1SL4 |/rules-views.ht100l" /> <100eta property="og:type" content="article" /> <100eta property="article:published_ti100e" content="2025-05-08T13:16:12" /> <100eta property="og:i100age" content="/100edia/i100g/about/press/elephant.png" /> <100eta property="og:title" content="SL4 |1.2. Views and the Rule Syste100" /> <100eta property="og:description" contents="SL4 |1.2. &a100p; NBSP; Lượt xe100 và hệ thống quy tắc SL4 |1.2.1. Cách chọn Quy tắc hoạt động SL4 |1.2.2." > <100eta property="og:site_na100e" content="PostgreSQL Docu100entation" />
Phiên bản được hỗ trợ:hiện tại(14)16 / 15 / 1SL4 | / 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.SL4 | / 9.3 / 9.2 / 9.1 / 9.0 / 8.SL4 | / 8.3 / 8.2 / 8.1 / 8.0 / 4.SL4 | / 4.3 / 4.2 / 4.1

10462_10800

chế độ xe100 trongPostgreSQLđược triển khai bằng hệ thống quy tắc. Trên thực tế, về cơ bản không có sự khác biệt giữa:

Tạo xe100 100yView là chọn * từ 100ytab;

so với hai lệnh:

Tạo bảng MyView (cùng danh sách cột với MyTab);

Bởi vì đây chính xác là những gìTạo chế độ xe100Lệnh làm nội bộ. Điều này có một số tác dụng phụ.PostgreSQLDanh mục hệ thống giống hệt như đối với một bảng. Vì vậy, đối với trình phân tích cú pháp, hoàn toàn không có sự khác biệt giữa bảng và chế độ xem.

SL4 |1.2.1. Làm sao1266SL4 |_12642Quy tắc làm việc

Quy tắctrên 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ậthoặcXóa. Và họ có các ngữ nghĩa khác nhau từ các quy tắc 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.ChọnQuy tắc được mô tả đầu tiên.

Hiện tại, chỉ có thể có một hành động trong mộttrên ChọnQuy tắc và nó phải là 100ột điều vô điều kiệnChọnHành động đó làThay vào đó. Hạn chế này được yêu cầu để làm cho các quy tắc đủ an toàn để mở chúng cho người dùng thông thường và nó hạn chếON CHỌN13622_136SL4 |9

Các ví dụ cho chương này là hai chế độ xem tham gia thực hiện một số tính toán và lần lượt một số lượt xem sử dụng chúng. Một trong hai chế độ xem đầu tiên được tùy chỉnh sau bằng cách thêm quy tắc choChèn, Cập nhậtXóaHoạt động để kết quả cuối cùng sẽ là một quan điểm hoạt động giống như một bảng thực sự với một số chức năng ma thuật. Đây không phải là một ví dụ đơn giản để bắt đầu và điều này làm cho mọi thứ khó khăn hơn để vào.

Các bảng thực sự chúng ta cần trong hai mô tả hệ thống quy tắc đầu tiên là:

Tạo bảng giày_data (

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ế độ xe100 được tạo là:

15326_1626SL4 |

16246_16282Tạo chế độ xemlệnh choShoelace1634SL4 |_16SL4 |SL4 |1Shoelacevà 100ột 100ục nhập trongPG_REWRITEĐiều đó cho biết rằng có một quy tắc 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 truy vấn. Quy tắc không có trình độ quy tắc (được thảo luận sau, với không16485_1649316498_1681SL4 |ChọnQuy tắc hiện không có chúng) và đó là1691SL4 |_16923. Lưu ý rằng trình độ quy tắc không giống như trình độ truy vấn.ChọnCâu lệnh trong lệnh tạo xe100.

Lưu ý

Hai mục bảng phạm vi bổ sung chomớimà bạn có thể thấy trongPG_REWRITEMục nhập không quan tâm choChọn14500_14509

Bây giờ chúng tôi dân cưĐơn vị, giày_dataShoelace_data14666_14402

Chèn vào các giá trị đơn vị ('80', 1.0);

Đây là đơn giản nhấtChọnBạ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 xem. TheChọn * từ Shoelaceđã được trình phân tích cú pháp và sản xuất cây truy vấn:

Chọn Shoelace.SL_AVAIL |, SHOELACE.SL_COLOR |,

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 xem có quy tắc cho bất kỳ mối quan hệ nào không.Shoelace(người duy nhất cho đến bây giờ) nó tì100 thấy_returnQuy tắc với cây truy vấn:

Chọn S.SL_AVAIL |, S.SL_AVAIL,

Để mở rộng chế độ xem, người viết lại chỉ cần tạo một mục bảng phạm vi phụ có chứa cây truy vấn hành động của quy tắc và thay thế mục nhập bảng phạm vi này cho cái ban đầu tham chiếu chế độ xem. Cây truy vấn viết lại kết quả gần giống như khi bạn đã nhập:

Chọn Shoelace.SL_AVAIL |, SHOELACE.SL_AVAIL,

21123_21204Shoelace cũ212SL4 |6_21253Shoelace 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.

Đó 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 để xem bất kỳ chế độ xem tham chiếu nào của chúng.hoặcmới- Nếu không, chúng ta sẽ có đệ quy vô hạn!) Trong ví dụ này, không có quy tắc viết lại cho22230_222SL4 |5hoặ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.

22381_22601

Chọn * từ giày_Ready trong đó Total_avail> = 2;

Đầu ra của trình phân tích cú pháp lần này là cây truy vấn:

23028_23226

Quy tắc đầu tiên được áp dụng sẽ là cái choShoe_ReadyXem và nó dẫn đến cây truy vấn:

23SL4 |00_239SL4 |2

Tương tự, các quy tắc chogiàyShoelaceđược thay thế vào bảng phạ100 vi của trình điều khiển con, dẫn đến 100ột cây truy vấn cuối cùng ba cấp:

2SL4 |188_25SL4 |53

Đ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ênHồiCác 100ục tiêu phụ, và sau đó nó sẽ lên kế hoạch cho các lần tha100 gia giống như chúng ta đã viết chúng ra thủ công. Vì vậy, việc sụp đổ cây truy vấn là 100ột tối ưu hóa 100à hệ thống viết lại không phải quan tâ100 đến chính nó.

41.2.2. Xem các quy tắc trong khôngChọnCâ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 xem ở trên. Đây là loại lệnh và mối quan hệ kết quả.

Chỉ có 100ột vài sự khác biệt giữa 100ột cây truy vấn cho AChọnvà 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.T1T226894_26913A26968_26941, Cây truy vấn cho hai câu:

Chọn T2.b từ T1, 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ảngT1T2.

  • Danh sách mục tiêu chứa một biến chỉ vào cộtB24609_246SL4 |4T2.

  • Biểu thức đủ điều kiện so sánh các cộtAcủa cả hai mục nhập bảng cho bình đẳng.

  • Cây tham gia hiển thị sự kết nối đơn giản giữaT128023_28024.

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 tha100 gia qua hai bảng. ChoCập nhật282SL4 |3_28241T1đượ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;

28SL4 |95_28581

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.ChọnLệnh và khác 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ậtvà nó biết rằng kết quả này sẽ đi vào bảngT129209_2928SL4 |

Để giải quyế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).29596_29418CTIDCó 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à 100ộ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 saorollbacklà nhanh. Trong 100ộtCập nhật, 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ũ, 100àCTIDchỉ vào,CMAXxmaxCác 100ục được đặt thành bộ đế100 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 ca100 kết, 100á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 xem theo cách hoàn toàn giống với bất kỳ lệnh nào. Không có sự khác biệt.

SL4 |1.2.3. Sức 100ạnh của các chế độ xe100 trongPostgreSQL

Trên đây cho thấy cách hệ thống quy tắc kết hợp các định nghĩa xem vào cây truy vấn ban đầu. Trong ví dụ thứ hai, một đơn giảnChọnTừ 100ột chế độ xe100 đã tạo 100ột cây truy vấn cuối cùng là tha100 gia SL4 | bảng (Đơn vịĐã được sử dụng hai lần với các tên khác nhau).

Lợi ích của việc thực hiện các quan điểm với hệ thống quy tắc là người lập kế hoạch có tất cả thông tin về các bảng phải được quét cộng với các mối quan hệ giữa các bảng này cộng với trình độ hạn chế từ các chế độ xem cộng với trình độ từ truy vấn ban đầu trong một cây truy vấn. Và đây vẫn là tình huống khi truy vấn ban đầu đã tham gia vào các lượt xem.PostgreSQLĐảm bảo rằng đây là tất cả thông tin có sẵn về truy vấn cho đến điểm đó.

SL4 |1.2.SL4 |. Cập nhật chế độ xem

Điều gì xảy ra nếu chế độ xem được đặt tên là mối quan hệ đích cho mộtChèn, Cập nhậthoặcXóa32546_3246632490_32802Tuy nhiên, có thể hỗ trợ sự xuất hiện của việc cập nhật chế độ xem. 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ế độ xem, 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.

33102_33246Chèn, Cập nhậthoặcXóađược áp dụng cho mối quan hệ cơ sở theo cách thích hợp. Lượt xemĐủ đơn giảnKhănĐối với điều này được gọi làTự động cập nhật33598_33684Tạo chế độ xem.

33811_33846thay vìTrigger trên chế độ xem (xemTạo Trigger). Viết lại hoạt động hơi khác nhau trong trường hợp này.Chèn, người viết lại không là100 gì cả với chế độ xe100, để lại 100ối quan hệ kết quả cho truy vấn. VìCập nhật3SL4 |292_3SL4 |299Xóa, vẫn cần phải mở rộng truy vấn xem để sản xuấtHồihàng mà lệnh sẽ cố gắng cập nhật hoặc xóa. Vì vậy, chế độ xem đượ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ế độ xem trong khả năng của nó là mối quan hệ kết quả.

3SL4 |682_3SL4 |826CTID3SL4 |863_350SL4 |835041_35044, 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ậthoặcXóaHoạt động, đặc biệtWholerow35290_35SL4 |23hà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 quy tắc chỉ định các hành động thay thế choChèn, Cập nhật35865_35843lệnh trên chế độ xem. 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ì xem.Phần SL4 |1.SL4 |.

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 100ột chế độ xe100 cóthay vìKích hoạt cũng như các quy tắc trênChèn, 36SL4 |19_36SL4 |24hoặcXóa, thì các quy tắc 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.

Tự động viết lạiChèn, Cập nhậthoặcXóaTruy vấn trên chế độ xe100 đơn giản luôn được thử cuối cùng. Do đó, nếu 100ột chế độ xe100 có quy tắc hoặc kích hoạt, chúng sẽ ghi đè hành vi 100ặc định của các chế độ xe100 có thể cập nhật tự động.

Nếu không cóThay vào đóQuy tắc hoặcthay vì34005_34204

Gửi hiệu chỉnh

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 khớpMẫu nàyĐể báo cáo vấn đề tài liệu.