Как отслеживать изменения в структуре таблицы в Sql Server

У меня есть таблица с тремя столбцами (имя, возраст, город). Теперь, если через какое-то время кто-то добавит в таблицу один дополнительный столбец (страна). Как мне узнать, какой столбец был добавлен в таблицу, т.е. страна.

Есть ли способ отслеживать изменения структуры таблицы всякий раз, когда кто-либо меняет структуру таблицы?


person Rahul Singh    schedule 30.08.2012    source источник


Ответы (2)


Триггеры SQL Server DDL можно использовать для отслеживания изменений DDL, независимо от того, были ли они преднамеренными или случайными. Кто совершил изменение, когда и на что повлияло совершенное действие — это основная информация, которую необходимо получить с помощью триггеров. Для использования этого решения необходимо создать и поддерживать как триггеры, так и хранилище перехваченной информации.

В следующем примере информация о событии, вызвавшем срабатывание триггера, собирается с помощью функции EVENTDATA() SQL Server. Сценарий SQL создает триггер DDL, который фиксирует события CREATE, ALTER и DROP на уровне базы данных (хотя триггеры могут быть созданы на уровне сервера для захвата событий для всех баз данных на сервере; вместо параметра ON ALL SERVER следует использовать параметр ON ALL SERVER). В БАЗЕ):

CREATE TRIGGER Audit_DDL
ON DATABASE
    FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE
AS
     DECLARE
        @event xml;
     SET
     @event = EVENTDATA();
     INSERT INTO Audit_DDL_Events
     VALUES
     (
     REPLACE(CONVERT(varchar(50),
     @event.query('data(/EVENT_INSTANCE/PostTime)')), 'T', ' ')
     ,
     CONVERT(varchar(150),
     @event.query('data(/EVENT_INSTANCE/LoginName)'))
     ,
     CONVERT(varchar(150),
     @event.query('data(/EVENT_INSTANCE/UserName)'))
     ,
     CONVERT(varchar(150),
     @event.query('data(/EVENT_INSTANCE/DatabaseName)'))
     ,
     CONVERT(varchar(150),
     @event.query('data(/EVENT_INSTANCE/SchemaName)'))
     ,
     CONVERT(varchar(150),
     @event.query('data(/EVENT_INSTANCE/ObjectName)'))
     ,
     CONVERT(varchar(150),
     @event.query('data(/EVENT_INSTANCE/ObjectType)'))
     ,
 CONVERT(varchar(max),
 @event.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)'))
 );

Также необходимо создать соответствующую таблицу хранения для данных аудита из EVENTDATA XML:

CREATE TABLE Audit_DDL_Events
(
             DDL_Event_Time            datetime
             ,
             DDL_Login_Name            varchar(150)
             ,
             DDL_User_Name             varchar(150)
             ,
             DDL_Database_Name         varchar(150)
             ,
             DDL_Schema_Name           varchar(150)
             ,
             DDL_Object_Name           varchar(150)
             ,
             DDL_Object_Type           varchar(150)
             ,
             DDL_Command              varchar(max)
);
person Ivan Stankovic    schedule 28.02.2014

Вы можете использовать триггеры DDL для отслеживания изменений в структуре базы данных. Хорошую статью на эту тему можно найти здесь .

стороннее редактирование

Цитата из связанной статьи

Триггеры DDL... запускают хранимые процедуры в ответ на событие. Они запускаются в ответ на различные события языка определения данных (DDL). Эти события задаются операторами T-SQL, которые начинаются с ключевых слов CREATE, ALTER и DROP. ... Они используются для административных задач, таких как аудит и регулирование операций базы данных.

person Krešimir Lukin    schedule 30.08.2012
comment
Мне не нужно отслеживать изменения структуры базы данных, но я хотел бы отслеживать изменения структуры таблицы. - person Rahul Singh; 30.08.2012
comment
Да, триггеры DDL — это события сервера sql, которые запускаются при появлении изменений в структуре, вы можете использовать их для отслеживания изменений. Просто проверьте статью, которую я связал. - person Krešimir Lukin; 30.08.2012
comment
Можете ли вы предоставить мне образец или пример для выполнения задачи. Ответьте, пожалуйста. - person Rahul Singh; 05.09.2012
comment
Документация (с примерами) есть в technet. technet.microsoft.com/en-us/library/ms175941.aspx - person Doug; 28.09.2012
comment
Проверьте этот вопрос: dba.stackexchange.com/questions/25049/ - person ; 28.09.2012