Как определить, была ли база данных изменена или нет? - PullRequest
4 голосов
/ 24 марта 2010

Мне нужно определить, изменилась ли база данных на MS SQL Server между двумя разными моментами.

Изменение может быть структурным или связанным с данными, и проверка должна быть общей (т. Е. Независимой от структуры базы данных). Желательно, чтобы проверка выполнялась на основе T-SQL или с SMO, а не на основе файлов. Я проверил MSDN, но пока не нашел ничего подходящего.

Ответы [ 4 ]

3 голосов
/ 07 февраля 2014

Возможным решением для описанного вами сценария является чтение журнала транзакций базы данных (файл LDF). Любые изменения, как в схеме, так и на уровне данных, которые были зафиксированы в базе данных, записываются в журнал транзакций базы данных. Теперь, как прочитать информацию, которая находится в t-log?

Вы можете использовать собственные функции SQL Server fn_dblog , DBCC PAGE или fn_dump_dblog или какой-либо инструмент стороннего производителя. Тем не менее, нативные функции не документированы, и очень трудно понять результаты, которые они предоставляют. Что касается стороннего инструмента, вы можете проверить Открыть файл LDF и просмотреть содержимое файла LDF онлайн-статью для более подробной информации и более глубокого анализа того, что требуется для чтения информации журнала транзакций

Отказ от ответственности: я работаю инженером службы поддержки продуктов в ApexSQL

2 голосов
/ 24 марта 2010

Для SQL Server 2005 и выше вы можете добавить триггер DDL, например:

CREATE TRIGGER [YourDatabaseTrigger]
ON DATABASE
FOR DDL_EVENTS
AS

DECLARE @EventData      xml
DECLARE @Message        varchar(1000)
SET @EventData=EVENTDATA()

INSERT INTO YourLogTable 
    (EventDateTime,EventDescription) 
    VALUES (GETDATE(),SUSER_NAME()
                     +'; '+@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(250)')
                     +'; '+@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(250)')
                     +'; '+@EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
           )
RETURN
GO

ENABLE TRIGGER [YourDatabaseTrigger] ON DATABASE

Затем вам нужно будет создать триггеры (для INSERT / UPDATE / DELETE) для каждой таблицы в базе данных, которые будут вставлены в ту же таблицу:

CREATE TRIGGER YourTableTrigger On YourTable
FOR INSERT
AS

INSERT INTO YourLogTable 
    (EventDateTime,EventDescription) 
    SELECT GETDATE(),SUSER_NAME()
                     +'; INSERT YourTable'+
                     +'; data='+...your column data here...
    FROM INSERTED
GO
1 голос
/ 24 марта 2010

Для структурных изменений вы, возможно, захотите занести в журнал события DDL на своем сервере, используя триггеры DDL или Service Broker . Однако выявить изменения данных может быть гораздо сложнее, если вам не с чем сравнивать. Я могу думать о Снимок базы данных как о возможном решении (требуется Enterprise Edition).

1 голос
/ 24 марта 2010

Red Gate производит два продукта, которые могут вас заинтересовать:

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

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