Truy vấn định nghĩa của chế độ xem cụ thể hóa trong Postgres


21

Tôi đang tự hỏi làm thế nào để truy vấn định nghĩa của một khung nhìn cụ thể hóa trong Postgres. Để tham khảo, những gì tôi hy vọng sẽ làm rất giống với những gì bạn có thể làm cho một chế độ xem thông thường:

SELECT * FROM information_schema.views WHERE table_name = 'some_view';

cung cấp cho bạn các cột sau:

table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into

Điều này có thể cho quan điểm cụ thể hóa?

Từ nghiên cứu của tôi cho đến nay, có vẻ như các quan điểm cụ thể hóa được cố tình loại trừ khỏi information_schema, bởi vì

Information_schema chỉ có thể hiển thị các đối tượng tồn tại trong tiêu chuẩn SQL.

( http://www.postgresql.org/message-id/3794,1412980686@sss.pgh.pa.us )

Vì chúng dường như bị loại trừ hoàn toàn khỏi information_schema, tôi không chắc chắn cách thực hiện điều này, nhưng điều tôi muốn làm là gấp đôi:

  1. Truy vấn xem một quan điểm cụ thể hóa tồn tại. (Cho đến nay, cách duy nhất tôi tìm thấy để làm điều này là thử tạo chế độ xem mat có cùng tên và xem liệu nó có nổ không.)
  2. Và sau đó truy vấn định nghĩa của khung nhìn cụ thể hóa (tương tự như view_definitioncột trên information_schema.views).

Một số câu hỏi liên quan đến truy vấn cho các ràng buộc duy nhất về các quan điểm cụ thể hóa: dba.stackexchange.com/questions/101899
Sean the Bean

Bạn sẽ quan tâm đến cách nhanh chóng để kiểm tra sự tồn tại: SELECT to_regclass('some_schema.some_mat_view')- nếu được tìm thấy, mặc dù vậy, nó không phải là một MV. Chi tiết: stackoverflow.com/questions/20582500/ Lời
Erwin Brandstetter

Câu trả lời:



13

Hóa ra điều này không phức tạp như tôi nghĩ! (Chỉ với một chút kiến ​​thức về pg_catalog ...)

Phần 1: Truy vấn xem có tồn tại chế độ xem cụ thể không:

SELECT count(*) > 0
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'm'
AND n.nspname = 'some_schema'
AND c.relname = 'some_mat_view';

Tốt đẹp và dễ dàng.

Phần 2: Truy vấn định nghĩa của một khung nhìn cụ thể hóa:

Để đưa ra một truy vấn để có được định nghĩa của chế độ xem mat, trước tiên tôi phải tìm định nghĩa của information_schema.viewschế độ xem bằng cách chạy:

SELECT view_definition
FROM information_schema.views
WHERE table_schema = 'information_schema'
AND table_name = 'views';

Sau đó, tôi đã sao chép truy vấn và thay đổi c.relkind = 'v'::"char"thành c.relkind = 'm'::"char"để có được lượt xem mat (thay vì lượt xem thông thường). Xem toàn bộ truy vấn tại đây: http://pastebin.com/p60xwfes

Tại thời điểm này, bạn có thể dễ dàng thêm AND c.relname = 'some_mat_view'và chạy nó để có được định nghĩa some_mat_view.

Nhưng bạn vẫn phải làm lại từ đầu lần sau khi bạn muốn tìm định nghĩa của chế độ xem mat ...

Phần thưởng: Tạo chế độ xem để thực hiện việc này dễ dàng hơn

Tôi đã chọn tạo một chế độ xem mới để dễ dàng tra cứu các định nghĩa về chế độ xem mat trong tương lai. Về cơ bản tôi chỉ cần thêm CREATE VIEW materialized_views ASvào phần đầu của truy vấn được liên kết ở trên để tạo chế độ xem mới và bây giờ tôi có thể truy vấn nó như vậy:

SELECT *
FROM materialized_views
WHERE table_schema = 'some_schema'
AND table_name = 'some_mat_view';

Tốt hơn nhiều!

Tôi cũng có thể sử dụng chế độ xem này để dễ dàng truy vấn xem chế độ xem cụ thể có tồn tại hay không bằng cách thay đổi *thành count(*) > 0.

Tuyên bố miễn trừ trách nhiệm : Tôi không biết các cột khác trong kết quả truy vấn là hoàn toàn chính xác, vì các chế độ xem được cụ thể hóa khác về cơ bản với các chế độ xem tiêu chuẩn (tôi nghĩ rằng chúng đúng). Nhưng điều này ít nhất là truy vấn table_schema, table_nameview_definitionchính xác.


0

Hạn chế với các câu trả lời khác ở đây là bạn chỉ cần có định nghĩa SQL, trong khi trong hầu hết các trường hợp, bạn quan tâm đến các cột thực tế và có thể thao tác chúng dưới dạng văn bản. Sau đây là câu trả lời của tôi từ một câu hỏi tương tự , bao gồm tên cột và kiểu dữ liệu:

Tôi không thể nói rằng tôi hoàn toàn hiểu mô hình dữ liệu cơ bản, vì vậy hãy sử dụng giải pháp của tôi dưới đây với một hạt muối:

select 
    ns.nspname as schema_name, 
    cls.relname as table_name, 
    attr.attname as column_name,
    trim(leading '_' from tp.typname) as datatype
from pg_catalog.pg_attribute as attr
join pg_catalog.pg_class as cls on cls.oid = attr.attrelid
join pg_catalog.pg_namespace as ns on ns.oid = cls.relnamespace
join pg_catalog.pg_type as tp on tp.typelem = attr.atttypid
where 
    ns.nspname = 'your_schema' and
    cls.relname = 'your_materialized_view' and 
    not attr.attisdropped and 
    cast(tp.typanalyze as text) = 'array_typanalyze' and 
    attr.attnum > 0
order by 
    attr.attnum

Bạn phải thay đổi 'your_schema''your_materialized_view'.

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.