คิวรีการบันทึกและ T-SQL อื่น ๆ


14

ฉันต้องการทราบว่า SQL Server 2008 R2 มีรูปแบบการบันทึกเริ่มต้นสำหรับSELECTคำสั่ง (หรือ T-SQL อื่น ๆ สำหรับเรื่องนั้น)

ถ้าใช่ฉันจะดูได้ที่ไหน หากไม่มีฉันจะตั้งค่าได้อย่างไร

คำตอบ:


18

ตามค่าเริ่มต้นกิจกรรมของ SQL Server จะไม่ถูกบันทึกตามที่คุณคาดหวัง กิจกรรมการเขียนบางอย่างถูกบันทึกไว้ในบันทึกการทำธุรกรรมแต่ยังขึ้นอยู่กับวิธีการตั้งค่าฐานข้อมูลของคุณ

มีสี่ตัวเลือกหลักสำหรับการติดตามกิจกรรม SELECT บนเซิร์ฟเวอร์:

  1. คุณสามารถใช้SQL Server Profilerเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ของคุณและคอยดูกิจกรรมเฉพาะที่เกิดขึ้น

  2. คุณสามารถสร้างการติดตามฝั่งเซิร์ฟเวอร์เพื่อบันทึกกิจกรรมไปยังไฟล์การติดตามบนเซิร์ฟเวอร์ซึ่งสามารถอ่านได้โดย SQL Server Profiler หรือโดยใช้fn_trace_gettableเพื่อโหลดลงในตารางสำหรับการวิเคราะห์เพิ่มเติม

  3. คุณสามารถใช้Extended Eventsซึ่งมีฟังก์ชันการทำงานมากกว่าการติดตามฝั่งเซิร์ฟเวอร์และ Microsoft แนะนำให้ใช้แทนการติดตามฝั่งเซิร์ฟเวอร์เริ่มต้นด้วย SQL Server 2012

  4. คุณสามารถใช้โหมดการตรวจสอบ C2

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


5

มีโซลูชันและเทคนิค SQL Server หลายวิธีสำหรับการติดตามคำสั่ง SELECT

  1. ขั้นตอนและฟังก์ชั่นการจัดเก็บที่พัฒนาขึ้นเป็นพิเศษ - หมายเหตุ: วิธีนี้ต้องการความรู้ขั้นสูงเกี่ยวกับการเขียนโปรแกรม T-SQL และการบำรุงรักษาขั้นตอนและฟังก์ชั่นที่จัดเก็บเพิ่มเติม (เช่นในกรณีที่มีการเปลี่ยนแปลงสกีมาฐานข้อมูล) คุณสามารถดูเพิ่มเติมในบทความนี้: http://alstechtips.blogspot.com/2011/02/auditing-select-statements-in-sql.html

  2. เทคโนโลยีการติดตาม SQL Server - คุณสามารถอ่านคำแนะนำทีละขั้นตอนในบทความนี้: http://solutioncenter.apexsql.com/auditing-select-statements-on-sql-server/

  3. การใช้คุณสมบัติการตรวจสอบเซิร์ฟเวอร์ SQL - คุณสมบัติการตรวจสอบ (แนะนำใน SQL Server 2008) สามารถติดตามเหตุการณ์เซิร์ฟเวอร์และฐานข้อมูลและใช้เทคโนโลยี Extended Events แต่การตรวจสอบระดับฐานข้อมูลได้รับการสนับสนุนโดย SQL Server Developer และ Enterprise editions เท่านั้น

  4. การใช้เครื่องมือของบุคคลที่สามเช่น ApexSQL Audit หรือ Idera SQL Compliance Manager


3

ตามค่าเริ่มต้นจะไม่บันทึกคำสั่ง SELECT คุณสามารถอ้างถึงคำตอบของฉันที่นี่สำหรับรายละเอียดเพิ่มเติมเพื่อตรวจสอบคำสั่ง SELECT

นอกจากนี้ตามค่าเริ่มต้นแล้วมันไม่ได้บันทึกคำสั่ง T-SQL แทน แต่จะบันทึกกิจกรรมเช่นการเปลี่ยนแปลงหน่วยความจำเซิร์ฟเวอร์, การลงชื่อเข้าใช้การตรวจสอบล้มเหลว, ตรวจสอบเหตุการณ์ Addlogin ตรวจสอบ ฯลฯ และคุณสามารถค้นหาข้อมูลเพิ่มเติมได้ที่นี่พร้อมกับสคริปต์ T-SQL การติดตามเริ่มต้น


3

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

;WITH x AS
(
  SELECT 
    [text] = SUBSTRING(t.[text], 
      (s.statement_start_offset/2)+1, 
      COALESCE(NULLIF(s.statement_end_offset,-1),DATALENGTH(t.[text])*2)
       -(s.statement_start_offset/2)), 
    s.execution_count, s.last_execution_time,
    s.max_logical_reads, s.max_elapsed_time
  FROM sys.dm_exec_query_stats AS s
  CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) AS t
)
SELECT * FROM x
WHERE LTRIM([text]) LIKE 'SELECT%';

คุณอาจต้องการขยายรูปแบบ - ตัวอย่างเช่นสิ่งนี้จะละเว้นการสืบค้นที่เริ่มต้นด้วย;WITHแดกดันและสามารถจับภาพSELECT INTOและแม้แต่การกำหนดตัวแปรที่ไม่อ้างอิงตารางจริง

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


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

ฉันลองใช้วิธีแก้ปัญหาของคุณ - เป็นไปได้หรือไม่ที่นี่จะให้ขั้นตอนฟังก์ชันและทริกเกอร์เท่านั้นและไม่มีคำสั่ง sql ที่เรียกใช้งานหรือไม่
Magier

@Magier ไม่ sys.dm_exec_query_stats ควรรายงานเฉพาะข้อความสั่งแบบสอบถาม (เฉพาะกิจหรือจากโมดูล)
Aaron Bertrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.