Jak sprawdzić datę ostatniej zmiany w procedurze przechowywanej lub funkcji na serwerze SQL


182

Muszę sprawdzić, kiedy funkcja została ostatnio zmieniona. Wiem, jak sprawdzić datę utworzenia (jest to w oknie właściwości funkcji w SQL Server Management Studio).
Odkryłem, że w SQL Server 2000 nie można było sprawdzić daty modyfikacji (spójrz na ten post: Czy można ustalić, kiedy procedura przechowywana była ostatnio modyfikowana w SQL Server 2000? )

Czy można to sprawdzić w SQL Server 2008? Czy MS dodaje jakieś nowe funkcje do tabel systemowych, które pozwalają to sprawdzić?

Odpowiedzi:


385
SELECT name, create_date, modify_date 
FROM sys.objects
WHERE type = 'P'
ORDER BY modify_date DESC

typeDla funkcji jest FNraczej niż Pdla procedury. Lub możesz filtrować według kolumny nazwy.


5
wydaje się, że niektóre uprawnienia mogą powodować pomijanie wyników w tym zapytaniu - nawet jeśli niektóre wyniki się zwracają. Zaobserwowaliśmy różne wyniki w oparciu o uprawnienia użytkownika - ale nie zawęziłem go do tego, które organy są zaangażowane. Krótko mówiąc: uruchom to zapytanie jako SA, jeśli możesz mieć pewność, że wszystko widzisz.
Ryan Guill

1
Naprawdę masz rację. msdn.microsoft.com/en-us/library/ms190324%28v=sql.105%29.aspx „W SQL Server 2005 i nowszych wersjach widoczność metadanych w widokach katalogu jest ograniczona do elementów zabezpieczanych, które użytkownik jest właścicielem lub na które użytkownik otrzymał uprawnienia. Aby uzyskać więcej informacji, zobacz Konfiguracja widoczności metadanych ”.
Chris Diver

2
Słowo ostrzeżenia. Jeśli OP odnosi się wyłącznie do zmian w module dokonanych za pomocą instrukcji ALTER DDL, modify_datemoże to być mylące. Na przykład, jeśli sys.sp_refreshsqlmodulejest wykonywany na module, modify_datezostanie on zmieniony, chociaż technicznie kod modułu nie zmienił się.
gravidThoughts

w jaki sposób można uzyskać tylko określone Procedury przechowywane bazy danych ?!
Irfan,

2
@im_one Po wierszu WHERE dodaj AND name = 'specified procedure'gdzie specified procedurejest nazwa przechowywanego proc, który chcesz znaleźć.
TylerH,

41

Wypróbuj to dla procedur przechowywanych:

SELECT name, create_date, modify_date
FROM sys.objects
WHERE type = 'P'
AND name = 'myProc'

1
To powinna być zaakceptowana odpowiedź, ponieważ jest to prosta i bezpośrednia.
user3454439

13

Oto poprawne rozwiązanie do znalezienia funkcji:

SELECT name, create_date, modify_date
FROM sys.objects
WHERE type = 'fn'
AND name = 'fn_NAME'

7

Znalazłem to jako nową technikę

To jest bardzo szczegółowe

SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' 
order by  LAST_ALTERED desc

SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' 
order by  CREATED desc 


SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'FUNCTION' and ROUTINE_SCHEMA = N'dbo' 
order by  LAST_ALTERED desc

SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'FUNCTION' and ROUTINE_SCHEMA = N'dbo' 
order by  CREATED desc 

4

W przypadku SQL 2000 użyłbym:

SELECT name, crdate, refdate 
FROM sysobjects
WHERE type = 'P' 
ORDER BY refdate desc

Co z 2008 r.? Czy to nie jest pytanie ...?
NREZ,

Zapytania @NREZ dotyczące sysobjects są obsługiwane w 2008 roku, więc to zadziała
Paul

refdate nie jest datą ostatniej modyfikacji. Sprawdź różnicę daty między sys.object a sysobjects.
access_granted

2

W najnowszej wersji (2012 lub więcej) możemy uzyskać szczegółowe informacje o zmodyfikowanej procedurze przechowywanej za pomocą tego zapytania

SELECT create_date, modify_date, name FROM sys.procedures 
ORDER BY modify_date DESC

0
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF') 
AND name = 'dgdsgds'

1
Czy mogę prosić o dodanie dodatkowego kontekstu wokół odpowiedzi? Odpowiedzi zawierające tylko kod są trudne do zrozumienia. Pomoże zarówno pytającemu, jak i przyszłym czytelnikom, czy możesz dodać więcej informacji w swoim poście.
RBT

0

Możesz użyć tego do sprawdzenia daty modyfikacji functionsi stored proceduresrazem uporządkowane według daty:

SELECT 'Stored procedure' as [Type] ,name, create_date, modify_date 
FROM sys.objects
WHERE type = 'P' 

UNION all

Select 'Function' as [Type],name, create_date, modify_date
FROM sys.objects
WHERE type = 'FN'
ORDER BY modify_date DESC

lub:

SELECT type ,name, create_date, modify_date 
FROM sys.objects
WHERE type in('P','FN') 
ORDER BY modify_date DESC
-- this one shows type like : FN for function and P for stored procedure

Wynik będzie taki:

Type                 |  name      | create_date              |  modify_date
'Stored procedure'   | 'firstSp'  | 2018-08-04 07:36:40.890  |  2019-09-05 05:18:53.157
'Stored procedure'   | 'secondSp' | 2017-10-15 19:39:27.950  |  2019-09-05 05:15:14.963
'Function'           | 'firstFn'  | 2019-09-05 05:08:53.707  |  2019-09-05 05:08:53.707
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.