Сравнить хранимые процедуры в нескольких базах данных (SQL Server) - PullRequest
14 голосов
/ 25 января 2010

SQL Gurus -

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

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

Можно ли сравнить две или более баз данных, если скрипт просматривает все процедуры между двумя базами данных и возвращает несоответствия?

Что-то с эффектом:

DATABASE_1 | DATABASE_2  | MISMATCHED_PROCEDURE | DATABASE_1_MODIFY_DATE | DATABASE_2_MODIFY_DATE
Customer_1 | Customer_2  | sp_get_names         | 1/1/2010               | 1/2/2010
Customer_1 | Customer_2  | sp_add_person        | 1/5/2010               | 1/6/2010

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

Большое спасибо!

Ответы [ 9 ]

19 голосов
/ 25 января 2010

Есть много инструментов для этого. Одним из лучших является Red-Gate SQL Compare. Другой очень хорошей альтернативой является использование Visual Studio Database Professional для управления схемой базы данных. Помимо всего прочего, он сделает очень хорошие сравнения схем.

11 голосов
/ 15 марта 2013

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

Для синхронизации баз данных вы можете попробовать ApexSQL Diff . Это похоже на сравнение SQL от Red Gate.

select S1.name [Db1_Schema], O1.name as [Db1_Object], O1.modify_date,
S2.name [Db1_Schema], O2.name as [Db1_Object], O2.modify_date
from database.sys.all_objects O1
inner join database2.sys.all_objects O2 on O1.name = O2.name
inner join database.sys.syscomments C1 on O1.object_id = C1.id
inner join database2.sys.syscomments C2 on O2.object_id = C2.id
inner join database.sys.schemas S1 on O1.schema_id = S1.schema_id
inner join database2.sys.schemas S2 on O2.schema_id = S2.schema_id
where C1.text <> C2.text and
-- remove the line below if you want to search all objects
O1.type = 'P' 
11 голосов
/ 25 января 2010

Если у вас нет системы SQL Compare или Visual Studio для архитекторов БД (Data Dude) ... поиграйте с этим ... SQL 2005 и выше

select t1.name,t1.modify_date,t2.modify_date
 from Database1.sys.procedures t1
join Database2.sys.procedures t2 on t1.name  = t2.name
and  object_definition(t1.object_id) <>  object_definition(t2.object_id)
3 голосов
/ 09 сентября 2010

Sql Compare от Red Gate - идеальное решение. Однако, если вы не можете себе позволить его стоимость, есть очень хорошее программное обеспечение, которое бесплатно : Sql Сравнить Star Inix http://www.starinix.com/sqlcompare02.htm

1 голос
/ 11 февраля 2016

Да, RedGate хорош, но это то, что я сделал, чтобы сравнить хранимые процедуры в двух разных базах данных: 1 - Сценарий всей хранимой процедуры в отдельных файлах. Это можно сделать с помощью мастера Microsoft SQL Server Management Studio. 2 - сделал то же самое из другой базы данных, с которой я сравниваю. 3 - Запустил KDiff3, который я считаю бесплатным. 4 - Дайте ему две директории, через которые он должен пройти. 5 - Теперь проверьте свои результаты, дважды щелкнув там, где вы видите красный цвет, и панель ниже покажет вам различия.

Готово! * * 1003

1 голос
/ 07 июня 2013

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

-- Declare 2 variable names to hold the name of the databases
DECLARE @DB1 varchar(50)
SET @DB1 = 'nameOfDb1'
DECLARE @DB2 varchar(50)
SET @DB2 = 'nameOfDb2'
EXEC('SELECT
        t1.name,
        t2.name
      FROM '
        + @DB1 +'.sys.procedures t1
      FULL OUTER JOIN '
    + @DB2 + '.sys.procedures t2
      on t1.name = t2.name
      where t1.object_id IS NULL
      OR t2.object_id IS NULL')
1 голос
/ 09 июля 2010

Это тангенциально связано, но я написал кое-что, что обеспечивает статистику совпадения в процентах между текстом двух хранимых процедур: http://www.sqlservercentral.com/scripts/T-SQL/65787/

1 голос
/ 25 января 2010

Упрощенный ответ, но создание сценария для всех процедур будет простым и эффективным.

0 голосов
/ 29 июля 2016

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

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE Specific_name = 'SP_SCRIPTDIFF')

DROP PROCEDURE DBO.SP_SCRIPTDIFF

GO

CREATE PROCEDURE [dbo].SP_SCRIPTDIFF

@DBNAME1 SYSNAME, 
@DBNAME2 SYSNAME

AS

/*
DATE      : 2016/07/29
AUTHOR    : SEENI 
OBJECTIVE : TO COMPARE THE FUNCTIONS, PROCEDURES AND TRIGGERS IN TWO DIFFERENT DATABASES, PASS NAME OF DATABASE1, AND DATABASE2 AS INPUTS.
*/

BEGIN

SET NOCOUNT ON 

Exec ('select  DISTINCT O1.name as [ObjectName], O1.modify_date As DateIn_'+@DBNAME1+',  O2.modify_date As DateIn_'+@DBNAME2+',o1.type as Type from '+
@DBNAME1+'.sys.all_objects O1 join '+ @DBNAME2+'.sys.all_objects O2 on O1.name = O2.name and  O1.type = O2.type join '+
@DBNAME1+'.sys.syscomments C1 on O1.object_id = C1.id join '+ @DBNAME2+'.sys.syscomments C2 on O2.object_id = C2.id join '+
@DBNAME1+'.sys.schemas S1 on O1.schema_id = S1.schema_id join '+ @DBNAME2+'.sys.schemas S2 on O2.schema_id = S2.schema_id
where C1.text <> C2.text and c1.colid = c2.colid  and O1.Type in (''FN'',''P'',''T'') And o1.Is_Ms_Shipped = 0  Order by O1.type,ObjectName')

RETURN

END 

GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...