Bagaimana saya bisa tahu prosedur atau pemicu tersimpan mana yang menggunakan tabel di SQL Server 2008 R2?


9

Ini adalah kasus di DB yang saya periksa, ada tabel arsip yang menyimpan riwayat pengguna, dan ada pemicu atau prosedur penyimpanan yang setelah beberapa waktu menghapus baris dari tabel ini, untuk menghindari kebesaran dari sama, saya tidak mendesain DB, saya hanya mengambil pemeliharaan aplikasi yang menggunakan DB ini, jadi saya tidak tahu nama prosedur atau pemicu yang tersimpan ini, yang ingin saya lakukan adalah mencari prosedur tersimpan ini atau memicu, periksa kode dan memodifikasinya untuk meninggalkan "riwayat pengguna" ini lebih lama di atas meja.

Seseorang mengatakan kepada saya untuk memeriksa tabel "sysobjects", di mana saya benar-benar dapat melihat sesuatu dengan nama tabel yang sama, tetapi ini adalah satu-satunya informasi yang dapat saya ambil, ada saran?

Terima kasih.

Jawaban:


6

Cari semua kode menggunakan sys.sql_modules

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules sm
WHERE definition LIKE '%Mytable%'

Atau gunakan Red Gate SQL Search yang sepenuhnya gratis

Jangan gunakan syscomments atau INFORMATION_SCHEMA.RUBBISH


Tidak bisakah orang itu juga mengklik kanan pada tabel target dan menekan "Show Dependencies" (atau beberapa teks untuk efek itu)?
Nick Chammas

@Nick Chammas: tidak, ini dikenal sebagai tidak dapat diandalkan
gbn

@ GBN, saya mengerti bahwa syscomments adalah untuk keterbelakangan mundur dan dapat dihapus dari rilis di masa mendatang, tetapi dapatkah Anda menjelaskan mengapa tidak menggunakan INFORMATION_SCHEMA? thx
datagod

@ datagod: sama mengapa syscomments sebagai selalu pilihan yang buruk: kolom definisi adalah nvarchar (4000). Ini berarti Anda mungkin kehilangan referensi tabel jika dalam posisi string> 4000 atau merentang batas antara nvarchar (4000) baris (tergantung bagaimana Anda menanganinya, bisa concat saya kira jika Anda benar - benar ingin ...
gbn

@ gbn Sebenarnya syscommentsmemiliki banyak baris untuk objek yang melampaui batas 4000 karakter, membuat kueri menggunakannya sama validnya sys.sql_modules. Namun saya masih merekomendasikan sys.sql_moduleskarena syscommentsdisusutkan.
Kenneth Fisher

4

Coba Pencarian ApexSQL

ApexSQL Search adalah SQL Server Management Studio dan Visual Studio add-in GRATIS, di antara fitur-fitur lainnya, memiliki fitur View Dependencies. Fitur Lihat Dependensi memiliki kemampuan untuk memvisualisasikan semua hubungan objek database SQL, termasuk hubungan antara objek yang dienkripsi dan sistem, objek khusus server SQL 2012, dan objek yang disimpan dalam database yang dienkripsi dengan Enkripsi Data Transparan (TDE)

Fitur Lihat Dependensi juga memungkinkan Anda untuk mengatur dan menyesuaikan tata letak diagram dependensi visual, termasuk hubungan yang akan disajikan, tata letak dan ukuran diagram yang dihasilkan, dan kedalaman penelusuran dependensi yang mendalam.

Penafian: Saya bekerja untuk ApexSQL sebagai Support Engineer


2

Untuk referensi di masa mendatang pada 2008 ada juga DMV yang dapat digunakan. sys.dm_sql_referencing_entities. Saya biasanya lebih suka menggunakan SQL_Modules karena menghindari kesalahan positif antara lain. Saya membahasnya di sini tetapi pada dasarnya jika Anda memiliki kode seperti ini:

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id) 
FROM sys.sql_modules WHERE [definition] LIKE '%ABC%'

Anda akan berakhir dengan hasil untuk tabel ABC, tabel ABCLog tampilan vw_ABC, prosedur tersimpan sp_Update_ABC dll. Juga setahu saya DMV akan menangani SPs terenkripsi serta tidak terenkripsi sementara metode sql_modules hanya bekerja dengan SPs tidak terenkripsi .

Versi DMV dari permintaan yang sama adalah ini:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.ABC', 'OBJECT')

1

Anda juga dapat menggunakan tampilan katalog sys.sql_expression_dependencies . Gunakan kueri ini:

SELECT 
referencing_object_name = obj.name, 
referencing_object_type_desc = obj.type_desc, 
referenced_object_name = referenced_entity_name
FROM sys.sql_expression_dependencies sd 
INNER JOIN sys.objects obj 
ON sd.referencing_id = obj.[object_id] 
WHERE referenced_entity_name = 'MyTable'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.