2011-02-02 3 views
2

Можно создать дубликат:
Auditing SQL Server data changesотслеживания в строки базы данных (SQL Server)

Мои требования спрос для каждой строки, вставленной и обновляется в базе данных, чтобы отслеживать, кто внес изменения (создатель/modifier), когда запись была создана и когда она была изменена. У меня есть GUIDs для идентификаторов строк во всех таблицах, поэтому я думал, что я придумал таблицу rowdata

rowdata: created (datetime), modified (datetime), createdby (строка или идентификатор пользователя), modifiedby и возможно summary колонок (строка, сводка изменений)

, а затем установить триггеры вставки/обновления на место. Считаете ли вы, что это хорошо или есть еще один ва (возможно, из коробки)?

My dev environment is .NET 4, поэтому, если вы думаете о других вариантах, которые могут возникнуть под вопросом, сообщите.

+0

Использование функций аудита SQL Server 2008 - см. Повторяющийся вопрос и ответ –

ответ

3

У меня есть аналогичные требования, но пошел об этом, добавив эти четыре столбца для всех таблиц, необходимых аудит гусеничный:

[Create_User] [nvarchar](100) NULL, 
[Create_Date] [datetimeoffset](7) NULL, 
[Modify_User] [nvarchar](100) NULL, 
[Modify_Date] [datetimeoffset](7) NULL, 

Триггер INSERT выглядит следующим образом:

CREATE TRIGGER [SomeSchema].[Some_Table_Insert_Create] ON [SomeSchema].[Some_Table] FOR INSERT AS 
    SET NOCOUNT ON 

    IF EXISTS(SELECT * FROM INSERTED WHERE Create_User IS NOT NULL) 
     BEGIN 
     UPDATE [SomeSchema].[Some_Table] SET 
      Create_Date = SYSDATETIMEOFFSET() 
     FROM 
      [SomeSchema].[Some_Table] 
     INNER JOIN 
      INSERTED 
     ON 
      [SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id 
     END 
    ELSE 
     BEGIN 
     UPDATE [SomeSchema].[Some_Table] SET 
      Create_User = SUSER_SNAME(), 
      Create_Date = SYSDATETIMEOFFSET() 
     FROM 
      [SomeSchema].[Some_Table] 
     INNER JOIN 
      INSERTED 
     ON 
      [SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id 
     END 

, и обновление триггер выглядит так:

CREATE TRIGGER [SomeSchema].[Some_Table_Update_Modify] ON [SomeSchema].[Some_Table] FOR UPDATE AS 

    SET NOCOUNT ON 

    IF NOT UPDATE (Create_User) AND NOT UPDATE (Create_Date) 
     BEGIN 
     IF EXISTS(SELECT * FROM INSERTED WHERE Modify_User IS NOT NULL) 
      BEGIN 
       UPDATE [SomeSchema].[Some_Table] SET 
        Modify_Date = SYSDATETIMEOFFSET() 
       FROM 
        [SomeSchema].[Some_Table] 
       INNER JOIN 
        INSERTED 
       ON 
        [SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id 
      END 
     ELSE 
      BEGIN 
       UPDATE [SomeSchema].[Some_Table] SET 
        Modify_User = SUSER_SNAME(), 
        Modify_Date = SYSDATETIMEOFFSET() 
       FROM 
        [SomeSchema].[Some_Table] 
       INNER JOIN 
        INSERTED 
       ON 
        [SomeSchema].[Some_Table].Some_Table_Id = INSERTED.Some_Table_Id 
      END 
     END 

Функция SUSER_SNAME() полезна для использования потому что мы используем олицетворение в нашей аутентификации приложений и Windows для подключения к БД. Это может не работать в вашем случае.

4

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

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