ฉันจะติดตามการพึ่งพาฐานข้อมูลได้อย่างไร


37

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

ฉันเคยทำงานในที่ที่มีการใช้ตัวเลือกที่โหดร้ายเช่น:

  • ปล่อยก่อนถามคำถามในภายหลัง (สามารถฆ่าการสร้างคลังข้อมูลถ้าพยายามแยกตารางที่ไม่มีอยู่อีกต่อไป)
  • ลบการอนุญาตก่อนและรอการรายงานข้อผิดพลาด (อาจทำให้เกิดข้อบกพร่องเงียบหากความล้มเหลวไม่ได้จัดการอย่างถูกต้อง)

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

คำตอบ:


14

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


7
  1. ค้นหารหัสการใช้งานด้วย sys.sql_modules.definition: มีการอ้างอิงหรือไม่ จากนั้น ...
  2. ตรวจสอบการอนุญาต: รหัสลูกค้าใดที่สามารถเรียกได้ จากนั้น ...
  3. Profiler

ดังนั้น:

  • สำหรับตารางที่ไม่มีการอ้างอิงและไม่มีการอนุญาตจะไม่ถูกใช้
  • หากไม่มีการอ้างอิงและการอนุญาตบางอย่างให้เรียกใช้ตัวสร้างโปรไฟล์เพื่อดูการใช้งาน
  • ไม่มีสิทธิ์และการอ้างอิงเพิ่มการบันทึกการใช้งาน

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


6

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

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

แก้ไข: เพื่อระบุจุดที่ตารางไม่สามารถเลือกทริกเกอร์ได้นี่คือตัวเลือกอื่นที่ควรใช้งานถ้าสมมติว่าตารางของคุณมีดัชนี (ทดสอบในปี 2008 เท่านั้น)

SELECT          
    last_user_seek,
    last_user_scan,
    last_user_lookup,
    last_user_update
FROM
    sys.dm_db_index_usage_stats AS usage_stats
INNER JOIN
sys.tables AS tables ON tables.object_id = usage_stats.object_id
WHERE
    database_id = DB_ID() AND
    tables.name = 'mytable' 

แต่โปรดทราบว่าตารางสถิติการใช้งานจะถูกล้างเมื่อเซิร์ฟเวอร์รีสตาร์ท, แยกออก ฯลฯ ดังนั้นคุณจะต้องตั้งค่างานเพื่อรวบรวมข้อมูล บิตของแฮ็คฉันรู้


4

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

ฉันสร้างรายการได้อย่างไร:

  1. ดูว่าไม่ใช้ตารางใดในโพรซีเดอร์และฟังก์ชันที่เก็บไว้ในปัจจุบัน

  2. ตารางเปล่า (บันทึกศูนย์);

  3. ตารางที่ไม่มีการอ้างอิง (ตารางที่ไม่มีความสัมพันธ์ใด ๆ );

  4. ดูว่าตารางใดไม่ได้ใช้งานตั้งแต่เซิร์ฟเวอร์ DB เริ่มทำงาน (DMVs)

หลังจากสร้างรายการในไฟล์ข้อความฉันได้สร้างชุดสคริปต์ที่จะแยกไฟล์. cs ของเรา (เรามีเพียง. net project) จากโฟลเดอร์ควบคุมเวอร์ชันแมปท้องถิ่นและดูว่าตารางเหล่านั้นถูกใช้ในไฟล์. cs หรือไม่ ไม่ควรเกิดขึ้น แต่เฮ้ .. ฉันมีเรื่องเซอร์ไพรส์) ถ้าไม่ใช่ก็ชัดเจนถ้าใช่เราจะสร้างรายการและมอบให้กับนักพัฒนาเพื่อตรวจสอบว่าโมดูลนั้นยังใช้งานอยู่

ดังนั้นในระยะสั้นคนก่อนหน้าถูกต้องไม่มีกระสุนเงิน


3

นโยบายที่ฉันใช้ใน บริษัท ของฉันคือการทำให้ทุกอย่างที่สัมผัสกับ SQL Server อยู่ภายใต้การควบคุมของแหล่งข้อมูลในตำแหน่งศูนย์กลาง

  • โครงการ asp.net
  • โครงการ SSRS
  • โครงการ SSIS
  • ฉันยังสคริปต์วัตถุฐานข้อมูลทั้งหมดลงในที่เก็บแปลก ๆ

ฉันยังไม่ได้เซ็ตอัพ แต่ในที่สุดฉันก็ต้องการใช้กลไกการค้นหาดัชนี / กลางบางอย่างที่ฉันสามารถใช้เพื่อค้นหาตารางเฉพาะ sprocs ฯลฯ เราจริง ๆ แล้วเป็นร้านเซิร์ฟเวอร์ SQL ใหม่ - แปลงจาก FoxPro . วัตถุ SQL เก่า ๆ นั้นยังไม่เป็นปัญหา แต่ฉันกำลังวางแผนสำหรับอนาคต

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


3

มีเครื่องมือและเทคนิคที่หลากหลายเพื่อใช้ในการติดตามการพึ่งพา:

เครื่องมือที่ฉันรู้:

  • ตัวแสดงการอ้างอิงของเซิร์ฟเวอร์ SQL (แต่อาจมีปัญหาถ้า sp ใช้ตารางถูกสร้างขึ้นก่อนที่จะสร้างตาราง)
  • Redgate SQL Dependency Tracker (ผ่านคำตอบของ @Eric Humphrey)
  • Resharper (เครื่องมือ. net ที่สามารถใช้ดูเส้นทางการโทรฉันคิดว่ามันสามารถใช้ในการติดตามตำแหน่งที่ใช้การโทร SQL ที่สำคัญ)

วิธีการ

  • รหัสค้นหาการใช้งานวัตถุ SQL (ทำซ้ำบางเครื่องมือด้านบน)
  • ดูสถิติการใช้งาน (เช่น: เมื่อวัตถุ SQL ที่เรียกว่าล่าสุด) ฉันใช้ SQL ด้านล่าง:

    SELECT 
        last_execution_time,   
        (SELECT TOP 1 
            SUBSTRING(s2.text,statement_start_offset / 2+1 , 
                ((CASE WHEN statement_end_offset = -1 THEN 
                    (LEN(CONVERT(nvarchar(max),s2.text)) * 2) 
                ELSE statement_end_offset END) - statement_start_offset) / 2+1)
        )  AS sql_statement,
        execution_count
    FROM sys.dm_exec_query_stats AS s1 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
    WHERE 
        s2.text like '%[OBJECT NAME]%' 
        and last_execution_time > [DATE YOU CARE ABOUT]
    ORDER BY last_execution_time desc

หมายเหตุ : ตารางสถิติการใช้งานจะถูกล้างเมื่อรีสตาร์ทเซิร์ฟเวอร์แยกออก ฯลฯ ดังนั้นคุณจะต้องตั้งค่างานเพื่อรวบรวมข้อมูล บิตของแฮ็คฉันรู้ (จาก @Miles D)

เทคนิค

  • ค้นหาการใช้งานครั้งล่าสุด (ดูสถิติการใช้งานด้านบน)
  • ค้นหาตำแหน่งที่ใช้ (ดูเครื่องมือ)
  • ตรวจสอบการใช้รหัสกับนักพัฒนาซอฟต์แวร์ (ผ่าน @MrDenny)
  • เปลี่ยนชื่อวัตถุ (เช่น: โพสต์ / คำนำหน้าด้วย _toBeDropped) และดูข้อผิดพลาด
  • เปลี่ยนสิทธิ์และดูข้อผิดพลาด
  • วางวัตถุและอธิษฐาน

2

หลายปีก่อนฉันพยายามสร้างเครื่องมือเพื่อตรวจสอบสิ่งที่คล้ายกัน คำตอบ TL; DR คือฉันพบว่าไม่สามารถทำได้กับทรัพยากรที่มีอยู่ในขณะนั้น

คอลัมน์นี้ใช้อยู่ที่ไหน

คำถามนี้มีความซับซ้อนมากขึ้นเมื่อคุณทราบว่ามีจำนวนแบบสอบถามแบบสอบถามและกระบวนงานที่เก็บไว้ใช้select *จากตารางที่คอลัมน์นั้นมีถิ่นที่อยู่จากนั้นคุณต้องดูโปรแกรมที่ใช้ผลลัพธ์เหล่านั้น - ดังนั้นคุณต้องใช้เครื่องสแกน / ดัชนี / parser ความสามารถในการอ่านซอร์สโค้ดที่อาจเป็น C #, Delphi, Java, VB, ASP (คลาสสิก) และอื่น ๆ เพียงพยายามที่จะตามล่าทุกการอ้างอิงถึงคอลัมน์นั้น จากนั้นคุณต้องวิเคราะห์โปรแกรมเหล่านั้นเพื่อลองและระบุว่ารหัสนั้นถูกเรียกอีกครั้งหรือไม่


2

จะได้จัดการออกจากการอ้างอิง SQL แต่คุณอาจต้องการตรวจสอบ Redgate ของSQL พึ่งพาติดตาม มันเป็นเครื่องมือสร้างภาพข้อมูลที่ดี


2

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

แน่นอนว่า SSIS จะเชื่อมต่อโดยตรงกับตารางดังนั้นสิ่งนี้อาจช่วยคุณได้ในตอนนี้ แต่เมื่อนักพัฒนาเชื่อมต่อกับฐานข้อมูลของคุณและบ่นว่าต้องรอคุณ (หรือใครก็ตามที่ทำหน้าที่เป็น DBA) เพื่อให้มุมมองและ sprocs ที่พวกเขาต้องการคุณสามารถบอกพวกเขาว่า: "ตารางหรือคอลัมน์ใด ๆ อาจถูกลบหรือเปลี่ยนชื่อ m มีภาระผูกพันเท่านั้นที่จะแจ้งให้คุณทราบถึงการเปลี่ยนแปลงมุมมองและ sprocs " และพวกเขาต้องทำการทดสอบการถดถอยสำหรับการเปลี่ยนแปลงเฉพาะเหล่านี้


0

TSQL ต่อไปนี้สามารถใช้ได้ sys.dm_sql_referencing_entities หรือ sys.sql_expression_dependencies

เครื่องมืออีกทางหนึ่งเช่น SQL Negotiator Pro, Redgate และอื่น ๆ สามารถสร้างสิ่งนี้ให้กับคุณโดยใช้ GUI

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