История изменения таблицы SQL Server 2005 - PullRequest
2 голосов
/ 06 апреля 2010

Поддерживает ли SQL Server какую-либо историю для отслеживания изменений в таблице, таких как добавление столбца, удаление, переименование, изменение типа / длины и т. Д.? Я обнаружил, что многие предлагают использовать хранимые процедуры, чтобы сделать это вручную. Но мне любопытно, хранит ли SQL Server такую ​​историю в каких-либо системных таблицах? Спасибо.

Ответы [ 3 ]

3 голосов
/ 06 апреля 2010

в SQL Server 2005 и выше вы можете создать триггер уровня базы данных для отслеживания изменений в таблице. Используйте что-то вроде:

CREATE TRIGGER [YourDatabaseTrigger]
ON DATABASE
FOR DDL_DATABASE_LEVEL_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

Вот несколько простых выводов из журнала:

select * from YourLogTable
EventID     EventDateTime           EventDescription
----------- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------
1           2010-04-06 08:25:47.333 sa; TABLE; YourLogTable2; create table YourLogTable2 (EventID int primary key identity(1,1),EventDateTime datetime, EventDescription varchar(max))
2           2010-04-06 08:25:55.113 sa; TABLE; YourLogTable2; drop table YourLogTable2

(2 row(s) affected)

вы можете расширить журнал, чтобы он содержал больше столбцов, или просто вывести все в один, как в этом простом примере.

2 голосов
/ 06 апреля 2010

Журналы транзакций хранят всю эту информацию, и команда DBCC LOG должна позволить вам просмотреть ее, но это недокументированная команда.

DBCC LOG(<database name>[,{0|1|2|3|4}])  
0 – Basic Log Information (default)  
1 – Lengthy Info  
2 – Very Length Info  
3 – Detailed  
4 – Full Example  

Синтаксис:

DBCC log (MY_DB, 4)  
1 голос
/ 06 апреля 2010

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

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

...