PostgreSQL: วางคอลัมน์จากมุมมอง


10

ฉันมีVIEWที่ที่ฉันพยายามสร้างสคริปต์วิวัฒนาการเพื่อให้ฉันสามารถเพิ่มคอลัมน์ลงไปได้ ส่วนนั้นใช้ได้ดี; เพิ่มคอลัมน์แล้วก็ได้ อย่างไรก็ตามการย้อนกลับไม่ทำงาน ลบคอลัมน์ที่เพิ่มล่าสุดล้มเหลวด้วยERROR: cannot drop columns from viewข้อความ ปัญหาคือว่ามุมมองนี้มีการอ้างอิงจำนวนมากทั้งจากและไปดังนั้นฉันไม่สามารถเพียงแค่DROP CASCADEสิ่งที่ยี้!

มีเหตุผลทำไมฉันไม่สามารถลบคอลัมน์ที่เพิ่มใหม่จากที่กำหนดVIEW? จากนั้นฉันจะทำอย่างไรเพื่อให้ภารกิจนี้สำเร็จ

(หมายเหตุ: สถานการณ์นี่คือสิ่งที่พวกเขาเป็น แต่ฉันเป็นอย่างดีสามารถดูสถานการณ์ที่คล้ายกันหรือที่รู้จักลดลงคอลัมน์จากมุมมองในกรณีอื่น ๆ อีกมากมาย)


คุณเพิ่มคอลัมน์ตั้งแต่แรกได้อย่างไร ALTER VIEW ... ADD COLUMNคุณไม่สามารถ คุณกำลังใช้CREATE OR REPLACE VIEW? กรุณาแสดงรหัสของคุณ
Craig Ringer

@CraigRinger ใช่CREATE OR REPLACE VIEWด้วยการกำหนดค่าเดียวกันยกเว้นคอลัมน์เพิ่มเติม (เนื่องจากตาราง ref'ed มีการเพิ่มคอลัมน์ใหม่ดังนั้นมุมมองจะต้องรวมไว้ด้วย) "ความรับผิดชอบ" เอาคอลัมน์จากตาราง ref'ed ที่เพื่อให้VIEWมีการยังไม่ได้กลับมามันอีกต่อไป
Yanick Rochon

คำตอบ:


13

PostgreSQL (ขึ้นจริงอย่างน้อย 9.4) CREATE OR REPLACE VIEWไม่สนับสนุนการลบคอลัมน์ที่มี

แบบสอบถามใหม่จะต้องสร้างคอลัมน์เดียวกันที่สร้างขึ้นโดยแบบสอบถามมุมมองที่มีอยู่ (นั่นคือชื่อคอลัมน์เดียวกันในลำดับเดียวกันและมีชนิดข้อมูลเดียวกัน) แต่อาจเพิ่มคอลัมน์เพิ่มเติมในตอนท้ายของรายการ

ไม่มีเหตุผลพื้นฐานที่ทำไมไม่สามารถเพิ่มการสนับสนุนสำหรับการวางคอลัมน์ แต่ยังไม่มีใครทำงานที่ต้องดำเนินการ

CREATE OR REPLACE VIEWจะต้องสแกนซ้ำทั้งหมดและตรวจสอบให้แน่ใจว่าไม่มีใครอ้างอิงถึงคอลัมน์ที่จะทิ้ง หากพวกเขาใช้SELECT *มันจะต้องลบคอลัมน์จากการขยายตัวของ*ในการพึ่งพาแล้วสแกนการอ้างอิงของมันด้วย มีงานที่เกี่ยวข้องกับการทำเช่นนั้นและมีบางพื้นที่ที่ยังไม่ชัดเจนว่าการวางคอลัมน์ควรทำอย่างไรโดยเฉพาะเมื่อพูดถึงการโต้ตอบกับการถ่ายโอนข้อมูลและการโหลดซ้ำ ดังนั้นจึงไม่มีใครต้องการคุณสมบัติเพียงพอที่จะใช้มัน ยินดีต้อนรับแพทช์และ / หรือการสนับสนุนการพัฒนา

คุณจะต้องวางมุมมองและทุกสิ่งที่ขึ้นอยู่กับมันจากนั้นสร้างมันขึ้นมาใหม่และการพึ่งพา (เช่นเคยเป็นจริงสำหรับการเพิ่มคอลัมน์ในมุมมองการสนับสนุนสำหรับการเพิ่มคอลัมน์ได้รับการแนะนำใน 8.4)

โปรดทราบว่าโดยทั่วไปไม่มีความคาดหวังว่า DDL จะสามารถย้อนกลับได้ แนวคิดของ "devolutions" มีข้อบกพร่องจริง ๆ ตัวอย่างเช่นหากคุณวางคอลัมน์จากนั้นเพิ่มอีกครั้งข้อมูลจะยังคงหายไป


2
ดังนั้นสิ่งที่คุณกำลังพูดก็คือเมื่อใดก็ตามที่แอปพลิเคชันขนาดใหญ่ที่มีความสัมพันธ์เชิงซ้อนต้องเปลี่ยนคอลัมน์มันจำเป็นต้องสร้าง DDL ใหม่ทั้งหมด (หรืออย่างน้อยที่สุด) DDL ฉันไม่ค่อยมีประสบการณ์กับ postgre แต่มาจาก mySQL ฉันไม่เคยมีปัญหาเช่นนั้น (กับ Oracle, SQL Server หรือ MySQL) และมันแปลกสำหรับฉันที่การเปลี่ยนแปลงไม่สามารถทำได้ง่ายและข้อผิดพลาด (ถ้า มี) ถูกโยนในเวลาดำเนินการแทน ข้อ จำกัด นี้ค่อนข้าง จำกัด
Yanick Rochon

@ YanickRochon ใช่มันเป็นความเจ็บปวดและฉันชอบที่จะเห็นมันดีขึ้น หากคุณต้องการช่วยให้เกิดขึ้นลองพิจารณาเงินทุนสนับสนุน ดูpostgresql.org/support/professional_support
Craig Ringer

เราเล็กเกินไปที่จะให้ทุนแก่องค์กรดังกล่าว แต่ดีใจที่ได้เห็นมันไม่ใช่หัวข้อที่แน่นอน
Yanick Rochon

1
@ YanickRochon ยุติธรรมพอ มันอยู่ในสิ่งที่ต้องทำ - "ช่วยให้มุมมอง / กฎ recompilation เมื่อพื้นฐานเปลี่ยนแปลงตาราง" wiki.postgresql.org/wiki/Todo#Views_and_Rules
Craig Ringer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.