Permintaan log dan T-SQL lainnya

14

Saya ingin tahu apakah SQL Server 2008 R2 memiliki skema pencatatan default untuk SELECTpernyataan (atau T-SQL lainnya).

Jika ya, di mana saya bisa melihatnya? Jika tidak, bagaimana saya bisa mengaturnya?

Xian Garcia
sumber

Jawaban:

18

Secara default, aktivitas SQL Server tidak dicatat seperti yang Anda harapkan. Beberapa aktivitas penulisan dicatat dalam Log Transaksi , tetapi ini juga tergantung pada bagaimana database Anda diatur.

Ada empat opsi utama untuk melacak aktivitas SELECT di server:

  1. Anda dapat menggunakan SQL Server Profiler untuk terhubung ke server Anda dan menonton aktivitas tertentu saat itu terjadi.

  2. Anda bisa membuat jejak sisi server untuk mencatat aktivitas ke file jejak di server, yang kemudian dapat dibaca oleh SQL Server Profiler, atau dengan menggunakan fn_trace_gettable untuk memuatnya ke dalam tabel untuk analisis lebih lanjut.

  3. Anda bisa menggunakan Peristiwa Diperpanjang , yang menawarkan lebih banyak fungsi daripada jejak sisi-server, dan yang direkomendasikan Microsoft alih-alih jejak sisi-server yang dimulai dengan SQL Server 2012.

  4. Anda dapat menggunakan mode audit C2 .

Anda dapat menggunakan SQL Server Profiler untuk mengatur jejak Anda (pilih peristiwa spesifik, filter, dll. Yang Anda inginkan), kemudian skrip keluar menggunakan menu File dan jalankan di server untuk membuat jejak sisi server, seperti dijelaskan di sini .

Nathan Jolly
sumber
5

Ada beberapa solusi dan teknik SQL Server untuk melacak pernyataan SELECT

  1. Prosedur dan fungsi tersimpan yang dikembangkan secara khusus - Catatan: metode ini membutuhkan pengetahuan lanjutan tentang pemrograman T-SQL dan pemeliharaan tambahan dari prosedur dan fungsi yang tersimpan (misalnya dalam kasus perubahan skema basis data). Anda dapat melihat lebih banyak di artikel ini: http://alstechtips.blogspot.com/2011/02/auditing-select-statements-in-sql.html

  2. Teknologi penelusuran SQL Server - Anda dapat membaca instruksi langkah demi langkah dalam artikel ini: http://solutioncenter.apexsql.com/auditing-select-statements-on-sql-server/

  3. Menggunakan fitur Audit SQL Server - Fitur Audit (diperkenalkan pada SQL Server 2008) dapat melacak peristiwa server dan database, dan menggunakan teknologi Extended Events. Tetapi, audit level basis data hanya didukung oleh SQL Server Developer dan edisi Enterprise.

  4. Menggunakan alat pihak ke-3 seperti ApexSQL Audit atau Idera SQL Compliance Manager

Baca Jaycob
sumber
3

Secara default, ini tidak mencatat pernyataan SELECT. Anda dapat merujuk ke jawaban saya di sini untuk detail lebih lanjut untuk mengaudit pernyataan SELECT.

Juga, secara default ia bahkan tidak mencatat pernyataan T-SQL, melainkan mencatat ACARA seperti Perubahan Memori Server, Gagal Masuk Audit, Acara Addlogin Audit, dll. Dan Anda dapat menemukan info lebih lanjut di sini bersama dengan T-SQL Script untuk mengekstrak informasi dari Jejak bawaan.

Kin Shah
sumber
3

Selama Anda tidak peduli siapa yang menjalankan kueri, ada beberapa cara untuk melihat metrik tentang kueri yang sedang dijalankan di sistem Anda. Ini terbatas pada data sejak restart terakhir dan berpotensi oleh tekanan cache rencana (atau memori lain) tergantung pada seberapa jauh Anda memperpanjang kueri.

;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%';

Anda mungkin ingin memperluas pola - misalnya ini akan mengabaikan pertanyaan yang dimulai dengan ;WITH, ironisnya, dan dapat menangkap SELECT INTOdan bahkan penugasan variabel yang tidak merujuk tabel aktual.

Namun jika Anda membutuhkan informasi lebih rinci dari itu, jawaban Nathan adalah awal yang baik (kecuali jika Anda akan menggunakan jejak, JANGAN gunakan Profiler). Ingatlah bahwa mencatat setiap permintaan tunggal terhadap sistem Anda tidak akan gratis.

Aaron Bertrand
sumber
Saya setuju dengan pernyataan di atas. Saya akan sangat berhati-hati dalam memonitor semua pernyataan pilih dalam database Anda.
Zane
Saya mencoba solusi Anda - mungkinkah ini hanya memberikan Prosedur, Fungsi dan Pemicu dan tidak ada pernyataan adhoc dieksekusi sql?
Magier
@Magier Tidak, sys.dm_exec_query_stats hanya boleh melaporkan pernyataan permintaan (ad hoc atau dari modul).
Aaron Bertrand