2010-03-24 3 views
4

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

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

+0

Изменить как ЛЮБОЕ изменение? Вы можете проверить номер транзакции. – TomTom

+0

Да, как в любых изменениях. Вставка/обновление/удаление в любой таблице или таблица изменений, изменение индекса и т. Д. Вид метки времени/строки, но для всей базы данных. – Locksfree

+0

Проверить вопрос http://stackoverflow.com/questions/2423909/is-there-meta-data-i-can-read-from-sql-server-to-know-the-last-changed-row-table/2424035 # 2424035 – Andrew

ответ

1

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

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

+0

Мы действительно используем SQL Compare, и это очень хороший продукт. Но здесь я имел в виду программно, либо в T-SQL, либо на сервере приложений с использованием SMO. – Locksfree

1

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

2

Для 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() 
        +'; '[email protected]('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(250)') 
        +'; '[email protected]('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(250)') 
        +'; '[email protected]('(/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 
3

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

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

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

Смежные вопросы