Как я могу быстро определить самые последние измененные хранимые процедуры в SQL Server

Мне нужно вручную перенести измененные хранимые процедуры из экземпляра базы данных DEV SQL Server 2005 в экземпляр TEST. За исключением изменений, которые я переношу, базы данных имеют одинаковые схемы. Как быстро определить, какие хранимые процедуры были изменены в базе данных DEV для переноса в экземпляр TEST?

Я предполагаю, что могу написать запрос к некоторым системным таблицам для просмотра объектов базы данных типа хранимой процедуры, сортируя их по каким-то последним измененным или скомпилированным данным, но я не уверен. Может быть, есть какая-то бесплатная утилита, которую кто-то может мне указать.

Заранее спасибо,

Боб


person Bob OMalley    schedule 17.09.2008    source источник


Ответы (7)


вместо использования sysobjects, которые больше не рекомендуются, используйте sys.procedures

select name,create_date,modify_date
from sys.procedures
order by modify_date desc

вы можете сделать предложение where самостоятельно, но это будет перечислять его в порядке убывания даты изменения

person SQLMenace    schedule 17.09.2008
comment
Добавьте к этому топ-100, чтобы сделать его еще лучше. - person Michael Brown; 17.09.2008
comment
Почему sysobjects больше не рекомендуется? - person feetwet; 25.08.2016
comment
@SQLMenate есть представление SQL SERVER IDE, чтобы перечислить то же самое, вместо ввода запроса, который я хочу использовать в окне, чтобы просмотреть то же самое. Можешь сказать где это находится? - person Pranesh Janarthanan; 09.01.2020

Bob OMalley, вероятно, уже давно решил свою проблему, но, надеюсь, новые читатели сочтут это полезным.

В некоторых особых случаях сценарии могут не дать оптимальных результатов.

Один из них — удаление хранимых процедур или других объектов в среде разработки — вы не поймаете это с помощью системных представлений, потому что объект там больше не будет существовать.

Кроме того, я не совсем уверен, что этот подход может работать с такими изменениями, как разрешения и тому подобное.

В таких случаях лучше всего использовать какой-нибудь сторонний инструмент, чтобы еще раз проверить, ничего ли не пропущено.

Я успешно использовал ApexSQL Diff в прошлом для аналогичных задач, и он отлично работал с большими базами данных. с более чем 1000 объектов, но вы не ошибетесь с уже упомянутым здесь SQL Compare или любым другим инструментом, существующим на рынке.

Отказ от ответственности: я не связан ни с одним из упомянутых здесь поставщиков, но я использую оба набора инструментов (Apex и RG) в компании, в которой работаю.

person Ron Biggs    schedule 04.09.2013

Вы можете выполнить этот запрос, чтобы найти все хранимые процедуры, измененные за последние x дней:

SELECT name
FROM sys.objects
WHERE type = 'P'
    AND DATEDIFF(D,modify_date, GETDATE()) < X
person Jason Stevenson    schedule 17.09.2008

Хотя это и не бесплатно, у меня был хороший опыт использования Red-Gates инструмента сравнения SQL. Это работало для меня в прошлом. У них есть бесплатная пробная версия, которой может быть достаточно, чтобы решить вашу текущую проблему.

person Craig    schedule 17.09.2008

вы также можете использовать следующий фрагмент кода

USE AdventureWorks2008;

GO

SELECT SprocName=name, create_date, modify_date

FROM sys.objects

WHERE type = 'P' 

AND name = 'uspUpdateEmployeeHireInfo'

GO
person RBS    schedule 17.09.2008

Существует несколько инструментов сравнения баз данных. Мне всегда нравился SQLCompare от Red Gate.

Вы также можете попробовать использовать:

SELECT name
FROM sys.objects
WHERE modify_date > @cutoffdate

В SQL 2000 это не всегда работало, потому что использование ALTER не обновляло дату правильно, но в 2005 году, я думаю, эта проблема устранена.

Я сам использую инструмент сравнения SQL, поэтому я не могу ручаться за этот метод на 100%

person Tom H    schedule 17.09.2008

Вы можете использовать следующий тип запроса для поиска измененных хранимых процедур, вы можете использовать любое число, кроме 7, в соответствии с вашими потребностями.

SELECT name
    FROM sys.objects
    WHERE type = 'P'
        AND DATEDIFF(D,modify_date, GETDATE()) < 7
person RBS    schedule 17.09.2008