Как проверить дату последнего изменения хранимой процедуры или функции на 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
Слово предупреждения. Если OP ссылается исключительно на изменения в модуле, сделанные с помощью инструкции 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
Это должен быть принятый ответ, потому что это просто и понятно.
user3454439

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

Запросы @NREZ к системным объектам поддерживаются в 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.