ฉันจะตรวจพบโพรซีเดอร์ที่เก็บที่เสียหายหลังจากการเปลี่ยนแปลงสกีมา


11

ฉันได้แก้ไขตารางกลางในฐานข้อมูลของฉันและ sp_depends ส่งคืนผลลัพธ์หลายร้อยรายการอย่างแท้จริงและฉันกังวลว่าบางขั้นตอนการจัดเก็บอาจไม่ได้รวบรวมอีกต่อไปหลังจากการเปลี่ยนแปลงของฉัน

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

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

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

ฉันใช้ SQLServer 2008 R2 และสคริปต์ฐานข้อมูลของฉันถูกเก็บไว้ในโครงการฐานข้อมูล VS 2008


เพื่อความกระจ่างแจ้งฉันไม่ได้ขอแนะนำให้ใช้วิธีทดสอบรหัสนี้เพียงอย่างเดียว เหมือนกับใน c # คุณตรวจพบข้อผิดพลาดทางไวยากรณ์ทันทีในไฟล์ที่ขึ้นต่อกันอื่น ๆ ในขณะที่คุณโค้ด (และจากนั้นใช้กลยุทธ์อื่น ๆ เพื่อทดสอบเช่นการทดสอบหน่วยซึ่งมักจะมีขนาดของคำสั่งช้าลง) ข้อผิดพลาดในไม่กี่วินาทีแทนที่จะต้องทำการทดสอบการทำงานเต็มรูปแบบซึ่งโดยทั่วไปอาจใช้เวลาสองสามชั่วโมงกว่าจะเสร็จสมบูรณ์

คำตอบ:


7

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


การทดสอบจะไม่ครอบคลุมรหัส 100% เสมอไปและโดยทั่วไปเมื่อใช้จะใช้เวลาสองสามชั่วโมงในการรัน ใน c # ฉันสามารถตรวจพบว่ารหัสของฉันยังคงรวบรวมในไม่กี่วินาที (โดยไม่คำนึงถึงความถูกต้อง) นี่ไม่ได้หมายความว่าฉันควรกดรหัส (โดยไม่คำนึงถึงรหัสที่เป็น c # หรือ PLSQL) ในการผลิตโดยไม่ต้องทดสอบอย่างถูกต้อง แต่ดูเหมือนว่าไม่มีเหตุผลที่จะมีวิธีตรวจสอบการพึ่งพาที่แตกหักได้อย่างรวดเร็วใช่ไหม
Brann

2
แต่น่าเสียดายที่รัฐ SQL Server ของศิลปะในขณะนี้ Vis-a-vis ของการตรวจสอบการพึ่งพาในขั้นตอนการเก็บคือ 'เสียอย่างล้ำลึก' ให้ดูที่การทำความเข้าใจ SQL อ้างอิงหรือsysdepends การรักษาถึงวันที่ใน SQL Server 2008 มีแม้กระทั่งเครื่องมือของบุคคลที่สามที่พยายามแก้ไขปัญหานี้
Remus Rusanu

2
สิ่งนี้ทำให้การทดสอบหน่วย / ฟังก์ชั่นนั้นเป็นวิธีเดียวที่เชื่อถือได้ในการตรวจจับการเปลี่ยนแปลงที่ผิดพลาด
Remus Rusanu

1
สำหรับการตรวจสอบอย่างรวดเร็วโครงการฐานข้อมูล Visual Studio ทำงานได้ค่อนข้างดีเมื่อตรวจสอบการเปลี่ยนแปลงใด ๆ
Remus Rusanu

4

มันสามารถแก้ไขได้ แต่คุณสามารถสร้างสคริปต์ CREATE PROCEDURE สำหรับฐานข้อมูล (คลิกขวาที่ฐานข้อมูล -> ภารกิจ -> สร้างสคริปต์) ค้นหาและแทนที่ CREATE PROCEDURE ด้วย ALTER PROCEDURE แล้วแยกวิเคราะห์

ฉันหวังว่าคุณจะได้คำตอบที่ดีกว่าที่นี่ - ฉันก็สนใจเช่นกัน! :)


ฉันไม่ได้ทำเครื่องหมายคำตอบของคุณเป็นที่ยอมรับเพราะฉันยังหวังว่าจะได้คำตอบที่สะอาดกว่า (หวังว่าจะเป็นสคริปต์ที่เขียนได้) แต่คุณจะได้ +1 ของฉัน! ขอบคุณ
Brann

3
วิธีการนี้จะไม่ให้คุณทราบว่าคุณกำลังอ้างอิงตารางที่ไม่มีอยู่จริง
Nick Chammas

วิธีการนี้ยังใช้ไม่ได้หากสคริปต์ที่สร้างมีขนาดใหญ่กว่าบรรทัดประมาณ 30k ฉันเกลียดที่ฉันรู้สิ่งนี้ ..
Eonasdan

3

คุณสามารถใช้เครื่องมือข้อมูลเซิร์ฟเวอร์ Sql (SSDT) Microsoft Visual Studio ช่วยให้คุณสามารถสร้างโครงการ SQL Server หนึ่งนำเข้าฐานข้อมูลลงในโครงการแล้วสร้างโครงการ หากมีกระบวนการหรือวัตถุใด ๆ ที่เก็บไว้เสียหายคุณจะได้รับข้อผิดพลาดในการรวบรวม


ฉันจะเพิ่มว่าคุณสามารถสร้างฐานข้อมูลใหม่สร้างสคริปต์จากโครงการ SSDT และเรียกใช้ในสภาพแวดล้อมการทดสอบซึ่งจะเป็นการตรวจสอบอย่างละเอียดว่าไม่มี procs / triggers / etc เสียเนื่องจากการเปลี่ยนแปลง schema
AaronLS

3

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

เพื่อสร้างสคริปต์ Alaa Awad ที่โพสต์ ... สิ่งนี้ควรแสดงสคีมาและฐานข้อมูลของออบเจ็กต์ที่อ้างอิงและการอ้างอิง หากคุณกำลังใช้ตารางชั่วคราวจำนวนมากผ่านนามแฝง (ซึ่งบางครั้งจะปรากฏเมื่อใช้sys.sql_expression_dependencies) พารามิเตอร์ UDTT หรือคุณสมบัติแบบไดนามิกอื่น ๆ ที่คุณอาจจำเป็นต้องใช้ฟังก์ชั่นsys.dm_sql_referenced_entitiesหรือsys.dm_sql_referencing_entitiesแทน / ด้วย

SELECT
    DB_NAME() + '.' + OBJECT_SCHEMA_NAME(sed.referencing_id) + '.' + OBJECT_NAME(sed.referencing_id) AS [referencingObject],
    isnull(sed.referenced_server_name + '.', '') + isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies sed
WHERE 
    sed.is_ambiguous = 0
    AND OBJECT_ID(isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name) IS NULL
ORDER BY
    [referencingObject], [missingReference]

1
ควรเพิ่มเหล่านี้เพื่อที่ประโยค: / * ไม่ใช่ประเภทผู้ที่มีอยู่และ / sed.referenced_entity_name NOT IN (SELECT [ชื่อ] จาก sys.types) /ไม่นามแฝง * / และ sed.referenced_schema_name IS NOT NULL
JasonBluefire

1

ใช้ sys.sql_expression_dependencies ที่เพิ่มใน sql server 2008

CREATE PROCEDURE [dbo].[spMaintenance_Find_Broken_Dependencies]

AS
SELECT
    OBJECT_NAME(referencing_id) AS [referencingObject],
    referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies
WHERE 
    is_ambiguous = 0
    AND OBJECT_ID(referenced_entity_name) IS NULL
ORDER BY 
    OBJECT_NAME(referencing_id), referenced_entity_name

GO

สิ่งนี้อาจมีประโยชน์อย่างไรก็ตามมันไม่ง่ายอย่างที่สคีมาต้องคำนึงถึงด้วย ฉันยังได้รับปัญหาที่ sys.sql_expession_dependencies แสดงนามแฝงที่ใช้แทนตารางที่ขึ้นอยู่กับความจริงซึ่งเห็นได้ชัดว่าล้มเหลวในการทดสอบ object_id () ในที่สุดมันก็ปรากฏขึ้นตารางที่ผู้ใช้กำหนดผ่านเป็นพารามิเตอร์ในการจัดเก็บ - ซึ่งไม่ได้มีประโยชน์จริงๆ
Tabloo Quijico
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.