Cómo verificar la fecha del último cambio en el procedimiento almacenado o la función en el servidor SQL

182

Necesito verificar cuándo se cambió la función la última vez. Sé cómo verificar la fecha de creación (está en la ventana de propiedades de la función en SQL Server Management Studio).
Descubrí que en SQL Server 2000 no era posible verificar la fecha de modificación (consulte esta publicación: ¿Es posible determinar cuándo se modificó por última vez un procedimiento almacenado en SQL Server 2000? )

¿Es posible verificarlo en SQL Server 2008? ¿MS agrega alguna característica nueva en las tablas del sistema que permite verificarla?

Marek Kwiendacz
fuente

Respuestas:

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

El typepara una función es FNmás que Ppara el procedimiento. O puede filtrar en la columna de nombre.

Chris Diver
fuente
55
parece que ciertos permisos pueden hacer que se omitan los resultados de esta consulta, aunque hay algunos resultados que regresan. Hemos observado diferentes resultados basados ​​en la autoridad del usuario, pero no lo he reducido a las autoridades involucradas. En pocas palabras: ejecute esta consulta como SA si puede para asegurarse de que está viendo todo.
Ryan Guill
1
De hecho tienes razón. msdn.microsoft.com/en-us/library/ms190324%28v=sql.105%29.aspx "En SQL Server 2005 y versiones posteriores, la visibilidad de los metadatos en las vistas de catálogo se limita a los objetos que posee un usuario o sobre el cual se ha otorgado permiso al usuario. Para obtener más información, consulte Configuración de visibilidad de metadatos ".
Chris Diver
2
Una palabra de advertencia. Si el OP se refiere exclusivamente a los cambios realizados en un módulo a través de una declaración ALTER DDL, modify_datepuede ser engañoso. Por ejemplo, si sys.sp_refreshsqlmodulese ejecuta en el módulo, modify_datese cambiará aunque técnicamente el código del módulo no haya cambiado.
gravidThoughts
¿Cómo puede obtener solo los procedimientos almacenados de la base de datos especificada?
Irfan
2
@im_one Después de la línea WHERE, agregue AND name = 'specified procedure'dónde specified procedureestá el nombre del proceso almacenado que desea encontrar.
TylerH
41

Pruebe esto para procedimientos almacenados:

SELECT name, create_date, modify_date
FROM sys.objects
WHERE type = 'P'
AND name = 'myProc'
openshac
fuente
1
Esta debería ser la respuesta aceptada porque es simple y directo.
user3454439
13

Esta es la solución correcta para encontrar una función:

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

Encontré esto como la nueva técnica

Esto es muy detallado

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 
Arun Prasad ES
fuente
4

Para SQL 2000 usaría:

SELECT name, crdate, refdate 
FROM sysobjects
WHERE type = 'P' 
ORDER BY refdate desc
Simón
fuente
¿Qué hay de 2008 ..? ¿No es esa la pregunta ...?
NREZ
Las consultas de @NREZ sobre sysobjects son compatibles en 2008, por lo que esto funcionará
Paul
refdate no es la última fecha de modificación. Verifique la diferencia de fecha entre sys.object y sysobjects.
access_granted
2

En la última versión (2012 o más) podemos obtener detalles modificados del procedimiento almacenado mediante el uso de esta consulta

SELECT create_date, modify_date, name FROM sys.procedures 
ORDER BY modify_date DESC
LTA
fuente
0
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF') 
AND name = 'dgdsgds'
Kris K
fuente
1
¿Puedo pedirle que agregue un poco más de contexto alrededor de su respuesta? Las respuestas de solo código son difíciles de entender. Ayudará tanto al autor de la pregunta como a los futuros lectores si puede agregar más información en su publicación.
RBT
0

Puede usar esto para verificar la fecha de modificación functionsy, en stored proceduresconjunto, ordenar por fecha:

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

o:

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

El resultado será así:

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
Mohamad Reza Shahrestani
fuente