Отслеживание изменений кода хранимых процедур, функций и таблиц в MSSQL

Есть база (mssql 2008 r2), в ней находятся таблицы, хранимые процедуры и функции. В результате непродуманности архитектуры, вышло так, что на текущий момент, что бы что-то поправить в базе, необходимо это делать непосредственно на «боевом» сервере. Это касается процедур, таблиц и функций. В результате невозможно отследить, кто и во сколько правил код базы.

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

Спасибо.
  • Вопрос задан
  • 5607 просмотров
Решения вопроса 1
Да, триггер то что нужно!
если нужна именно система контроля версий то у RedGate есть чудесное средство, называется SQL Source control
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@art_karetnikov
Лучший мой проект: Мобильный банк Сбербанка РФ.
Вообще элементарно. Триггер на базу.

Шаг первый:

CREATE TABLE [dbo].[tbl_ListChange](
[LoginName] [varchar](2000) NULL,
[HostName] [varchar](100) NULL,
[ObjectName] [varchar](100) NULL,
[ObjectType] [varchar](100) NULL,
[EventType] [varchar](100) NULL,
[EventSQLCommand] [varchar](max) NULL,
[EventTime] [datetime] NOT NULL,
[XMLChange] [xml] NULL,
[Id] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_tbl_ListChange] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]

GO

EXEC sys.sp_addextendedproperty name=N'MS_Description', value=N'Полностью xml команда, содержащая все вообще ', @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'tbl_ListChange', @level2type=N'COLUMN',@level2name=N'XMLChange'
GO

Шаг второй: — триггер на базу:

CREATE TRIGGER [tgr_DDLListChange]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS

— Каретников. 25-03-2010. Мониторинг всех изменений в базе

SET NOCOUNT ON

DECLARE @dataXML XML
SET @dataXML = EVENTDATA() — получил данные по текущему событию.

IF (
SELECT @dataXML.value('(/EVENT_INSTANCE/ObjectName)[1]' ,'varchar(max)')
) IS NOT NULL
BEGIN
INSERT dbo.tbl_ListChange
(
LoginName — под чьим логином
,HostName — на чьей машине
,ObjectName — что изменено
,ObjectType — тип измененного обьекта
,EventType — тип изменения
,EventSQLCommand — полностью SQL команда
,EventTime — во сколь изменено
,XMLChange — полностью вся хмл-команда
)
VALUES
(
@dataXML.value('(/EVENT_INSTANCE/LoginName)[1]' ,'varchar(2000)') — под чьим логином
,HOST_NAME() — на чьей машине
,@dataXML.value('(/EVENT_INSTANCE/ObjectName)[1]' ,'varchar(100)') — что изменено
,@dataXML.value('(/EVENT_INSTANCE/ObjectType)[1]' ,'varchar(100)') — тип измененного обьекта
,@dataXML.value('(/EVENT_INSTANCE/EventType)[1]' ,'varchar(100)') — тип изменения
,@dataXML.value('(/EVENT_INSTANCE/TSQLCommand)[1]' ,'varchar(max)') — полностью SQL команда
,GETDATE()
, @dataXML
) — во сколь изменено
END


GO
Ответ написан
Комментировать
@alixa
Можете попробовать создать проект базы данных в VS2010 и выше.
Натравливаете мастер на вашу БД, получившийся проект кладете под версионное хранения (Git, Subversion, ...), дальше разработчики открывают проект в VS2010, правят код и публикуют на сервере уже только из проекта.
Преимущества
Можете начать писать модульные тесты на БД.

PS
Веду разработку большой CRM для строительной компании, сотни таблиц, все устраивает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы