Skąd mam wiedzieć, która procedura przechowywana lub wyzwalacz korzysta z tabeli w SQL Server 2008 R2?

9

Tak jest w przypadku, gdy sprawdzam DB, istnieje tabela archiwum, która przechowuje historię użytkownika, i istnieje procedura wyzwalacza lub przechowywania, która po pewnym czasie usuwa wiersze z tej tabeli, aby uniknąć nadmiernego rozmiaru to samo, nie zaprojektowałem bazy danych, po prostu zajmuję się obsługą aplikacji korzystającej z tej bazy danych, więc nie znam nazw tych procedur przechowywanych ani wyzwalaczy, chcę tylko zlokalizować tę procedurę przechowywaną lub uruchom, sprawdź kod i zmodyfikuj go, aby ta „historia użytkownika” pozostała dłużej na stole.

Ktoś kazał mi sprawdzić tabelę „sysobjects”, na której faktycznie widzę coś o tej samej nazwie, ale to jest jedyna informacja, którą udało mi się odzyskać, jakaś rada?

Dziękuję Ci.

farp332
źródło

Odpowiedzi:

6

Wyszukaj cały kod za pomocą sys.sql_modules

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

Lub skorzystaj z Red Gate SQL Search, który jest całkowicie darmowy

Nie używaj systemów ani INFORMACJE_SCHEMA.RUBBISH

gbn
źródło
Czy kolega nie może również kliknąć tabeli docelowej prawym przyciskiem myszy i nacisnąć „Pokaż zależności” (lub jakiś tekst w tym celu)?
Nick Chammas 16.11.11
@Nick Chammas: Nie, to jest dobrze znane jako niewiarygodne
gbn
@ gbn, rozumiem, że syscomments służy wstecznej kompatybilności i może zostać usunięty z przyszłej wersji, ale czy możesz wyjaśnić, dlaczego nie użyć INFORMACJE_SCHEMA? thx
datagod
@datagod: to samo, dlaczego syscomments jak zawsze zły wybór: kolumna definicji to nvarchar (4000). Oznacza to, że możesz przegapić odniesienie do tabeli, jeśli w pozycji łańcucha> 4000 lub rozciąga się granicę między wierszami nvarchar (4000) (zależy od tego, jak sobie z tym poradzisz, może się zgodzić, jeśli naprawdę chciałeś ...
gbn 16.11.11
@gbn W rzeczywistości syscommentsma wiele wierszy dla obiektu, który przekracza limit 4000 znaków, dzięki czemu zapytania z niego korzystają tak samo jak sys.sql_modules. Nadal sys.sql_modulesjednak polecam, ponieważ syscommentsjest amortyzowany.
Kenneth Fisher
4

Wypróbuj wyszukiwanie ApexSQL

ApexSQL Search to BEZPŁATNY SQL Server Management Studio i dodatek Visual Studio, który oprócz innych funkcji posiada funkcję View Dependencies. Funkcja View Dependencies ma możliwość wizualizacji wszystkich relacji między obiektami bazy danych SQL, w tym między obiektami zaszyfrowanymi a obiektowymi, obiektami specyficznymi dla SQL Server 2012 oraz obiektami przechowywanymi w bazach danych zaszyfrowanych za pomocą transparentnego szyfrowania danych (TDE)

Funkcja Wyświetl zależności pozwala także skonfigurować i dostosować wizualny układ diagramu zależności, w tym relacje, które zostaną przedstawione, układ i rozmiar generowanego diagramu oraz głębokość szczegółowości zależności

Uwaga: Pracuję dla ApexSQL jako inżynier wsparcia

Milica Medic
źródło
2

Dla odniesienia w przyszłości od 2008 r. Istnieje również DMV, którego można użyć. sys.dm_sql_referencing_entities. Zasadniczo wolę to od używania SQL_Modules, ponieważ między innymi pozwala to uniknąć fałszywych alarmów. Omówiłem to tutaj, ale w zasadzie jeśli masz taki kod:

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

Skończysz z wynikami dla tabeli ABC, tabeli ABCLoguj widok vw_ABC, procedura składowana sp_Update_ABC itp. Również według mojej najlepszej wiedzy DMV będzie obsługiwał zarówno zaszyfrowane SP, jak i niezaszyfrowane, podczas gdy metoda sql_modules działa tylko z niezaszyfrowanymi SP .

Wersja DMV tego samego zapytania jest następująca:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.ABC', 'OBJECT')
Kenneth Fisher
źródło
1

Możesz także użyć widoku katalogu sys.sql_expression_dependencies . Użyj tego zapytania:

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'
Milica Medic
źródło