Как проверить дату последнего изменения хранимой процедуры или функции на 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'
openshac
источник
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
LTA
источник
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
Мохамад Реза Шахрестани
источник