ฟังก์ชันสเกลาร์ที่ใช้ในคอลัมน์จากการคำนวณเป็นวิธีที่สะอาดที่สุดในการอัปเดตฟังก์ชั่น


10

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


4
ฉันแก้ไขสิ่งนี้เพียงบางส่วนด้วยการสร้างฟังก์ชั่นหลอกตาที่เรียกว่าของจริง แน่นอนถ้าลายเซ็นเปลี่ยนไป

3
น่าเสียดายที่ฉันไม่คิดว่าจะมีวิธี "วิเศษ" หรือ "สะอาดกว่า" ในการทำสิ่งนี้ หากคุณต้องการแก้ไขฟังก์ชั่น - คุณจะต้องวางคอลัมน์ปรับเปลี่ยนฟังก์ชั่นและเพิ่มคอลัมน์ทั้งหมดอีกครั้ง ไม่มีทางรอบนี้
marc_s

@marc_s ดีมันของมูลค่าการยิงผู้คนจำนวนมากมาร์ทรอบที่นี่ :)
robertc

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

1
ยังคงไม่มีที่ไหนใกล้เจ็บปวดเท่าการอัพเดทคำจำกัดความของ CLR UDT (แม้การเปลี่ยนแปลงเพียงแค่ปรับเปลี่ยนวิธีการและไม่ส่งผลกระทบต่อการเป็นตัวแทนการจัดเก็บเลย)
Martin Smith

คำตอบ:


2

นี่อาจใช้งานได้มากกว่า แต่ควรได้รับ (โดยประมาณ) สิ่งที่คุณเป็น:

1 - สร้างตารางใหม่ที่มีเพียง PK ของคุณจากตารางหลักและฟังก์ชันที่อัปเดต

2 - วางคอลัมน์เก่าของคุณ

3 - เปลี่ยนชื่อโต๊ะเก่าของคุณเป็นแบบอื่น TableName_Base

4 - สร้างVIEWตารางที่รวมตารางหลักของคุณเข้ากับตารางการค้นหาของคุณพร้อมกับเขตข้อมูลตามลำดับที่คุณต้องการดู ตั้งชื่อมุมมองว่าชื่อตารางดั้งเดิมของคุณคืออะไร

สิ่งนี้อาจสร้างปัญหาบางอย่างกับINSERTSและUPDATESเนื่องจากคุณจะเข้าถึงผ่านทางมุมมอง หากต้องการจัดการกับสิ่งที่คุณสามารถแทรกลงในตารางโดยตรงโดยข้ามมุมมอง


ดูเหมือนว่าจะมีงานมากขึ้นและมีความเสี่ยงในระดับเดียวกับการลบและเพิ่มคอลัมน์อีกครั้ง
robertc

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