ปิดใช้งานการตรวจสอบ Schema On Function / Stored Procedure


17

ฉันพยายามทำให้กระบวนการที่ดำเนินการเปลี่ยนแปลงกับฐานข้อมูล SQL Server 2008 R2 เป็นไปโดยอัตโนมัติ กระบวนการที่ฉันวางไว้และสร้างโพรซีเดอร์และฟังก์ชันที่เก็บไว้ของฉันใหม่รวมถึงเรียกใช้สคริปต์เพื่อเปลี่ยนตาราง / คอลัมน์ / ข้อมูล น่าเสียดายที่สคริปต์ตัวใดตัวหนึ่งต้องใช้ฟังก์ชันใดฟังก์ชันหนึ่งก่อน แต่ฉันไม่สามารถเรียกใช้การเปลี่ยนแปลง proc / ฟังก์ชั่นที่เก็บไว้ได้ทั้งหมดเพราะมันอาศัยคอลัมน์ที่เพิ่มเข้ามาจากสคริปต์การเปลี่ยนแปลงตาราง / คอลัมน์ / ข้อมูลก่อน

ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะเรียกใช้โพรซีเดอร์และฟังก์ชันที่เก็บไว้โดยไม่มี SQL Server ตรวจสอบคอลัมน์ที่ใช้ในการกำหนดฟังก์ชัน / SP? ฉันพยายามค้นหา แต่ไม่พบเงื่อนไขหรือคำสั่งเพื่อเปิดใช้งานสิ่งนี้


ดูเหมือนว่าคุณอาจต้องจัดเรียงการสร้างวัตถุในสคริปต์ของคุณใหม่
Thomas Stringer

@shark มันเป็นสคริปต์การเปลี่ยนแปลงที่ต้องอาศัยการพึ่งพาฟังก์ชั่นอยู่ที่นั่นซึ่งมันไม่ได้ในเวลา ... การทำเช่นนั้นจะต้องมีการแทรกแซงด้วยตนเอง; ฉันต้องการบางสิ่งที่เป็นอัตโนมัติมากขึ้น
Brian Mains

คำตอบ:


20

คุณสามารถสร้างกระบวนงานที่เก็บไว้ซึ่งอ้างอิงวัตถุที่ยังไม่มีอยู่ (เช่นตารางและฟังก์ชัน) คุณไม่สามารถสร้างกระบวนงานที่เก็บไว้ซึ่งอ้างอิงคอลัมน์ที่ยังไม่มีอยู่ในวัตถุที่มีอยู่แล้ว นี่คือดาบสองคมของการจำแนกชื่อรอการตัดบัญชี - SQL Server ให้ประโยชน์แก่คุณในบางกรณี แต่ไม่ทั้งหมด ดูความคิดของ Erland SET STRICT_CHECKS ON;เพื่อรับความคิดเกี่ยวกับสถานที่ที่งานนี้และสถานที่ที่แตก:

http://www.sommarskog.se/strict_checks.html

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

ไม่มีการตั้งค่าเหมือนSET DEFERRED_NAME_RESOLUTION OFF;ว่ามีการถามถึง:

http://connect.microsoft.com/sql/127152

IGNORE ALL_RESOLUTION;และมีการตั้งค่าที่ไม่เหมือนใคร


คุณสามารถหลีกเลี่ยงปัญหานี้ได้ในสองสามวิธี ได้แก่ :

(a) ใช้ dynamic SQL ในขั้นตอนการจัดเก็บที่ได้รับผลกระทบ

(b) สร้าง stub CREATE PROCEDUREโดยที่ไม่มีสิ่งใดอยู่แล้วเรียกใช้ส่วนที่เหลือของสคริปต์จากนั้นเรียกใช้ส่วนALTER PROCEDUREที่มีเนื้อหาจริง (ในสาระสำคัญปรับใช้ขั้นตอนในสองขั้นตอน)

(c) ทำให้เครื่องมือการปรับใช้ของคุณฉลาดขึ้นเกี่ยวกับลำดับของการดำเนินการ หากการเปลี่ยนแปลงตารางจำเป็นต้องมีฟังก์ชั่นให้สคริปต์การเปลี่ยนแปลงเหล่านั้นล่าสุด เครื่องมือเปรียบเทียบ Schema เช่น SQL Compare ของ RedGate ค่อนข้างดีเกี่ยวกับการสร้างสคริปต์ให้คุณตามลำดับการพึ่งพาที่เหมาะสม คุณไม่ได้พูดถึงเครื่องมือใดที่คุณใช้ แต่ถ้ามันไม่ทำเช่นนี้ ...

(d) Martin Smith มีวิธีแก้ปัญหาที่น่าสนใจที่นี่แต่ฉันไม่ได้เล่นด้วย


ว้าวแฮ็กมาร์ตินสมิ ธ นั้นฉลาดดี ฉันจะรู้สึกสกปรกเมื่อใช้ตอนนี้ แต่ในช่วงต้นยุค 20 ของฉันจะมี
John Zabroski

1

คุณสามารถสร้างกระบวนงานที่เก็บไว้ที่ลบหรือเปลี่ยนชื่อวัตถุที่มีปัญหาก่อนแล้วจึงเรียกใช้กระบวนงานที่เก็บไว้เดิมของคุณเป็น SQL แบบไดนามิก วิธีนี้คุณไม่ต้องเขียนโพรซีเดอร์ที่เก็บจริงอีกครั้งเพื่อใช้ไดนามิก SQL

รหัสด้านล่างนี้เรียกใช้กระบวนงานที่เก็บไว้ซึ่งอ้างอิงคอลัมน์ที่ยังไม่มีอยู่ (Expense_Super_Compare)

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

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