แทนที่มุมมองที่ปรากฏใน Postgres


23

ฉันมีมุมมองที่เป็นรูปธรรมPostgres 9.3ซึ่งฉันต้องการอัปเดตด้วยคอลัมน์ใหม่ อย่างไรก็ตามมุมมองที่ปรากฏอื่น ๆ ยังขึ้นอยู่กับมุมมองนี้และข้อความแสดงข้อผิดพลาดระบุว่าไม่สามารถวางมุมมองได้เมื่อวัตถุอื่นขึ้นอยู่กับมุมมองนี้

ข้อผิดพลาด: ไม่สามารถวางมุมมอง materialized ล่าสุด latest_charges ได้เนื่องจากวัตถุอื่นขึ้นอยู่กับมัน

นอกจากนี้ยังปรากฏจากเอกสารที่ว่าคำหลัก REPLACE ไม่ถูกต้องสำหรับมุมมองที่ปรากฏ มีทางลัดนอกเหนือจากการปล่อยวัตถุที่ต้องพึ่งพาทั้งหมดแล้วสร้างใหม่แต่ละรายการหรือไม่


7
น่าเศร้าที่ฉันคิดว่าคุณกำลังติดอยู่กับการทิ้งพวกเขาทั้งหมดและสร้างใหม่
Craig Ringer

@CraigRinger สนใจที่จะเพิ่มคำตอบนี้หรือไม่?
dezso

คำตอบ:


17

ตั้งแต่ PostgreSQL 9.4: แตกต่างจากเอกสารของ CREATE VIEWเอกสารของCREATE MATERIALIZED VIEWไม่ได้กล่าวถึงคำหลัก REPLACE ดูเหมือนว่าจะไม่มีทางลัดนอกเหนือจากการทิ้งวัตถุที่ต้องพึ่งพาทั้งหมดและสร้างใหม่แต่ละอัน

เมื่อคุณทำเช่นนั้นฉันสามารถแนะนำสองสิ่งเล็ก ๆ เท่านั้น:

  1. ใช้มุมมอง DROP MATERIALIZED blabla CASCADE เพื่อรับรายการของวัตถุที่ต้องพึ่งพาทั้งหมด
  2. ทำหล่นและนันทนาการของวัตถุที่อ้างถึงทั้งหมดในหนึ่งธุรกรรม

1
ขอบคุณนี่คือสิ่งที่ฉันทำ เป็นเพียงความเจ็บปวดที่ต้องรักษาให้ตรงตั้งแต่ฉันสร้างมุมมองพื้นฐานที่เป็นรูปธรรมเพื่อการวิเคราะห์ที่นำกลับมาใช้ใหม่ในมุมมองอื่น ๆ อีกมากมาย มุมมองพื้นฐานนั้นไม่ค่อยมีการเปลี่ยนแปลง แต่มุมมองนั้นขึ้นอยู่กับการเปลี่ยนแปลงทุกวัน
จอห์น

4

สำหรับสถานการณ์ของฉันฉันต้องการ จำกัด การดร็อปโดยใช้เลเยอร์การดู:

  1. สร้างสำเนาของมุมมอง materialized ต่อท้ายด้วย "_new" และยังใช้ "ไม่มีข้อมูล" เพื่อประสิทธิภาพตรวจสอบให้แน่ใจว่ามีการสร้างดัชนีใด ๆ ด้วยส่วนต่อท้ายและวัตถุอื่น ๆ ที่เกี่ยวข้องที่ค้นพบผ่าน DROP ...
  2. สร้างมุมมองตามมุมมอง materialized ใหม่เพื่อให้เลเยอร์ของสิ่งที่เป็นนามธรรมดังนั้นฉันจะต้องเปลี่ยนมันในที่เดียว
  3. แก้ไขการอ้างอิงที่มีอยู่เพื่ออ้างถึงมุมมองใหม่แทน (รีเฟรชข้อมูลหากจำเป็นก่อน)
  4. ดร็อปมุมมองและดัชนีที่ปรากฏจริงซึ่งตอนนี้ไม่ควรมีผู้ติดตาม
  5. เปลี่ยนมุมมองและดัชนีที่ปรากฏขึ้นเพื่อปล่อยคำต่อท้ายเพื่อเรียกคืนชื่อดั้งเดิม

เช่น.

create table test (myfield int);
insert into test values (1);
create materialized view mv_test as select myfield from test;
create view v_test as select myfield from mv_test;
select * from v_test;
create materialized view mv_test_new as select myfield, myfield+1 as myfield2 from test;
alter view v_test rename to v_test_old;
alter materialized view mv_test rename to mv_test_old;
create view v_test as select myfield,myfield2 from mv_test_new;
select * from v_test;
alter materialized view mv_test_new rename to mv_test;
drop view v_test_old; -- when ready
drop materialized view mv_test_old; -- when ready

ฉันไม่ชัดเจนในสองขั้นตอนสุดท้ายเหล่านั้น เป็น 4 ประโยคที่ทำงานเป็น 5 หรือไม่? คุณสามารถทำตัวอย่างสั้น ๆ กับ matviews และมุมมองที่ตั้งชื่อแล้วได้ไหม
kimbo305

แก้ไขประโยคที่ถูกตัดทอนและเพิ่มตัวอย่าง
RuiDC

1

ใน PgAdmin (เวอร์ชัน 4.x) ฉันสามารถแก้ไขคำจำกัดความได้อย่างง่ายดาย (ฉันเพิ่มส่วนคำสั่ง where) ในกล่องคุณสมบัติ ปัญหาของคุณสามารถแก้ไขได้ด้วยวิธีนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.