Сбор данных изменений - как узнать, кто внес изменения?

10

Отслеживание того, кто внес изменения, определенные CDC.

В продолжение моего хака с датой и временем я попробовал тот же подход, добавив suser_sname в качестве нового поля со значением по умолчанию в таблице отслеживания изменений cdc. Но это, кажется, возвращает владельца процесса cdc, а не пользователя, который инициировал изменение базовой таблицы. Я также пробовал original_login, но он возвращает логин учетной записи службы sql. Снова, вероятно, связано с процессом cdc, а не с пользователем, который инициировал изменение.

Я обнаружил аналогичный вопрос о переполнении стека, но без ответа, кроме отслеживания изменений из внешнего интерфейса или с помощью триггера, который, кажется, лишает цели использование cdc. Я бы не перепечатывал, но поскольку оригинал был на стековом потоке, я решил попробовать его, особенно если R2 или 2012 представили лучший способ.

Итак, вкратце: как мне узнать, кто внес изменения в сбор данных изменений?

RThomas
источник

Ответы:

7

Я подал ошибку об этом, но она была закрыта как «по замыслу».

http://connect.microsoft.com/SQLServer/feedback/details/283707/cdc-options-to-capture-more-data-username-date-time-etc

К сожалению, вам придется использовать другую технику (например, аудит SQL или триггер), чтобы получить эту информацию (и некоторый пользовательский код, чтобы попытаться как можно больше соотнести ее с данными CDC). Я писал об этом недостатке также в своей главе «Аудит SQL Server, отслеживание изменений и сбор данных изменений» в книге « Глубокие погружения в MVP SQL Server» (том 1).

Мне жаль, что у меня нет лучшего обходного пути для вас, но встроенные возможности CDC просто не будут соответствовать вашим требованиям. :-(

Аарон Бертран
источник
@Rhomas, вы по-прежнему можете голосовать за предметы, даже если они закрыты - они время от времени возвращаются. Еще более полезным, чем голосование, является добавление комментария, в котором излагаются подробности бизнес-потребностей, которые могут сделать эту информацию полезной, в том числе, возможно, стоимость рефакторинга для обхода отсутствующей функциональности. Я написал немного о том, как качественные данные могут перевесить количественные данные ...
Аарон Бертран
Приятно знать, я думал, что закрыто означает закрыто для голосования, а также. В своем комментарии я указал, что Oracle предлагает это в своей реализации CDC. Это кажется логичным. docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…
RThomas
6

Вы можете добавить столбец и иметь триггер для таблицы, чтобы заполнить пользователя при вставке / обновлении / удалении, и cdc сохранит это. Вы можете получить имя пользователя либо из пользовательского интерфейса, передавая имя пользователя с использованием контекстной информации, либо из фактического сеанса.

SET @CapturedBy = CAST(REPLACE(CAST(CONTEXT_INFO() AS VARCHAR(10)),CHAR(0),'''''''') AS INT)

IF(@CapturedBy) IS NULL
    BEGIN
       SELECT @CapturedBy = P.[Code]
       FROM sys.dm_exec_sessions AS S
         INNER JOIN [dbo].[Person] AS P
          ON S.[login_name] = P.[User_Name]
       WHERE S.[session_id] = @@spid
    END
user2031675
источник
0

Не могли бы вы добавить поле UpdatedBy в основную таблицу, установить для него значение по умолчанию SUSER_NAME () или ORIGINAL_LOGIN () и заполнить эти данные CDC? Я верю, что это даст вам ту же информацию, которую вы ищете.

шеф-повар
источник
Это только дает вам учетную запись svc / владельца cdc, вы можете заметить, что я попробовал эти вещи и задокументировал результаты в своем первоначальном вопросе еще в феврале.
RThomas
Ваш комментарий сказал, что вы добавили его в таблицу ChangeData. Я говорю об исходной таблице, на которой основана таблица ChangeData. Однако я понял, что после публикации это будет работать только для вставок
шеф-повар
Аааа, не уловил это. Теперь я понимаю, что вы говорите.
RThomas