Comment vérifier la date du dernier changement dans la procédure stockée ou la fonction dans le serveur SQL

182

Je dois vérifier quand la fonction a été modifiée la dernière fois. Je sais comment vérifier la date de création (c'est dans la fenêtre des propriétés de la fonction dans SQL Server Management Studio).
J'ai trouvé que dans SQL Server 2000, il n'était pas possible de vérifier la date de modification (regardez ce post: est-il possible de déterminer quand une procédure stockée a été modifiée pour la dernière fois dans SQL Server 2000? )

Est-il possible de le vérifier dans SQL Server 2008? MS ajoute-t-il une nouvelle fonctionnalité dans les tables système qui permettent de le vérifier?

Marek Kwiendacz
la source

Réponses:

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

Le typepour une fonction est FNplutôt que Ppour la procédure. Ou vous pouvez filtrer sur la colonne de nom.

Chris Diver
la source
5
il semble que certaines autorisations peuvent entraîner l'omission des résultats de cette requête, même si certains résultats sont renvoyés. Nous avons observé des résultats différents en fonction de l'autorité des utilisateurs - mais je n'ai pas précisé quelles autorités sont impliquées. En bref: exécutez cette requête en tant que SA si vous le pouvez pour vous assurer que vous voyez tout.
Ryan Guill
1
Vous avez en effet raison. msdn.microsoft.com/en-us/library/ms190324%28v=sql.105%29.aspx "Dans SQL Server 2005 et les versions ultérieures, la visibilité des métadonnées dans les vues de catalogue est limitée aux éléments sécurisables qu'un utilisateur possède ou sur lequel l'utilisateur a obtenu une autorisation. Pour plus d'informations, voir Configuration de la visibilité des métadonnées. "
Chris Diver
2
Un mot d'avertissement. Si l'OP se réfère exclusivement à des modifications apportées à un module via une instruction ALTER DDL, cela modify_datepeut être trompeur. Par exemple, si sys.sp_refreshsqlmoduleest exécuté sur le module, le modify_datesera changé même si techniquement le code du module n'a pas changé.
gravidThoughts
comment obtenir uniquement les procédures stockées de base de données spécifiées?
Irfan
2
@im_one Après la ligne WHERE, ajoutez AND name = 'specified procedure'specified procedureest le nom du processus stocké que vous voulez trouver.
TylerH
41

Essayez ceci pour les procédures stockées:

SELECT name, create_date, modify_date
FROM sys.objects
WHERE type = 'P'
AND name = 'myProc'
OpenShac
la source
1
Cela devrait être la réponse acceptée car elle est simple et directe.
user3454439
13

Voici la bonne solution pour trouver une fonction:

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

J'ai trouvé cela répertorié comme la nouvelle technique

C'est très détaillé

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
la source
4

Pour SQL 2000, j'utiliserais:

SELECT name, crdate, refdate 
FROM sysobjects
WHERE type = 'P' 
ORDER BY refdate desc
Simon
la source
Et 2008 ..? N'est-ce pas la question…?
NREZ
Les requêtes @NREZ sur les sysobjects sont prises en charge sur 2008, donc cela fonctionnera
Paul
refdate n'est pas la dernière date de modification. Vérifiez la différence de date entre sys.object et sysobjects.
access_granted
2

Dans la dernière version (2012 ou plus), nous pouvons obtenir des détails de procédure stockée modifiés en utilisant cette requête

SELECT create_date, modify_date, name FROM sys.procedures 
ORDER BY modify_date DESC
LTA
la source
0
SELECT *
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF') 
AND name = 'dgdsgds'
Kris K
la source
1
Puis-je vous demander d’ajouter un peu plus de contexte à votre réponse. Les réponses basées uniquement sur le code sont difficiles à comprendre. Cela aidera le demandeur et les futurs lecteurs si vous pouvez ajouter plus d'informations dans votre message.
RBT
0

Vous pouvez l'utiliser pour vérifier la date de modification functionset pour stored proceduresles ordonner par date:

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

ou :

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

Le résultat sera comme ceci:

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
la source