Як перевірити дату останньої зміни збереженої процедури або функції на SQL-сервері


182

Мені потрібно перевірити, коли функція була змінена востаннє. Я знаю, як перевірити дату створення (вона знаходиться у вікні функцій функцій у SQL Server Management Studio).
Я виявив, що в SQL Server 2000 не вдалося перевірити дату зміни (подивіться цей пост: Чи можна визначити, коли збережена процедура востаннє змінена в SQL Server 2000? )

Чи можна перевірити це в SQL Server 2008? Чи додає MS якусь нову функцію в системні таблиці, які дозволяють перевірити її?

Відповіді:


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

Функція typeдля, FNа не Pдля процедури. Або ви можете фільтрувати на стовпці імен.


5
видається, що певні дозволи можуть спричинити опущення результатів із цього запиту, хоча деякі результати повертаються. Ми спостерігали різні результати, що базуються на повноваженнях користувачів, але я не обмежував це, до якого залучені органи влади. Короткий виклад історії: запустіть цей запит як SA, якщо зможете переконатися, що ви все бачите.
Райан Гілл

1
Ви справді правильні. msdn.microsoft.com/en-us/library/ms190324%28v=sql.105%29.aspx "У SQL Server 2005 та новіших версіях видимість метаданих у переглядах каталогів обмежується обмеженнями, якими користувач володіє або на який користувачеві надано певний дозвіл. Для отримання додаткової інформації див. Конфігурація видимості метаданих. "
Кріс Дівер

2
Слово попередження. Якщо ОП посилається виключно на зміни модуля, внесені через операцію ALTER DDL, то це modify_dateможе ввести в оману. Наприклад, якщо sys.sp_refreshsqlmoduleвін виконується на модулі, modify_dateзаміна буде змінена, навіть якщо технічно код модуля не змінився.
gravidThoughts

як можна отримати лише збережені процедури визначеної бази даних ?!
Ірфан

2
@im_one Після рядка WHERE додайте, AND name = 'specified procedure'де specified procedureє ім’я збереженої програми, яку ви хочете знайти.
TylerH

41

Спробуйте це для збережених процедур:

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

1
Це має бути прийнятою відповіддю, оскільки це просто і прямо.
користувач3454439

13

Це правильне рішення для пошуку функції:

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

7

Я знайшов це в переліку як нову техніку

Це дуже докладно

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

Для SQL 2000 я б використовував:

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

А як щодо 2008 ..? Хіба це не питання ..?
НРЕЗ

@NREZ запити на sysobjects підтримуються у 2008 році, тому це спрацює
Павло

refdate - це не остання змінена дата. Перевірте різницю дат між sys.object та sysobjects.
access_granted

2

В останній версії (2012 або більше) ми можемо отримати модифіковані деталі збереженої процедури за допомогою цього запиту

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
Чи можу я попросити вас додати ще трохи контексту навколо вашої відповіді. Відповіді, що стосуються лише коду, важко зрозуміти. Це допоможе запитувачу та майбутнім читачам, якщо ви зможете додати більше інформації у своєму дописі.
RBT

0

Ви можете скористатися цією датою зміни дати functionsта stored proceduresразом упорядкованою датою:

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

або:

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

Результат буде таким:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.