2010-04-06 2 views
2

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

ответ

1

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

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

2

Журналы транзакций сохраняют всю эту информацию, и команда 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) 
3

в 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() 
        +'; '[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 

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

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) 

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

+0

Thanks KM. Но я уже пробовал триггеры ddl, которые отлично работают и могут легко использоваться в информации о журнале, если только новые столбцы добавляются в таблицу. Но я думаю, что было бы утомительной задачей использовать команды TSQL в журнале для изменений, таких как переименование столбца с ссылками на внешние ключи или изменение длины столбца типа varchar и т. Д. И хранилище скоро станет «проблемой» как Unreason сказал. – Kayes

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