Стратегии входа аудита

Используйте array_agg(), если вы хотите истинный массив:

select field_name, array_agg(id)
from the_table
group by field_name;

или string_agg(), если вы хотите получить список через запятую:

select field_name, string_agg(id::text, ',')
from the_table
group by field_name;
7
задан GEOCHET 6 March 2009 в 01:39
поделиться

5 ответов

Контрольный журнал является в основном хронологическим списком событий, которые произошли, кто выполнил эти события, и каковы события были.

Я думаю, что плоское представление было бы лучше, поскольку оно может быть легко заказано и запрошено. Таким образом, я больше склоняюсь к Вашей опции # 2/#3.

Включайте вещи как тип транзакции, время, идентификатор пользователя, описание того, что изменяется, и другая уместная информация, связанная с Вашим продуктом.

Можно также добавить вещи к продукту со временем, и Вы не должны будете постоянно изменять свой модуль контрольного журнала.

5
ответ дан 6 December 2019 в 10:03
поделиться

Я пошел бы с (2) и (3): составьте единственную таблицу для всех Контрольных записей.

Плоское представление хорошо, если дополнительное выравнивание работы не влияет на производительность.

1
ответ дан 6 December 2019 в 10:03
поделиться

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

0
ответ дан 6 December 2019 в 10:03
поделиться

Если бы это для аудита целей, я использовал бы истинный носитель только добавления, а не таблицу/таблицы в том же дб.

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

3
ответ дан 6 December 2019 в 10:03
поделиться

Ваш обработчик событий DoWork shoud периодически проверяют BackgroundWorker. CancellationPending и набор DoWorkEventArgs. Отменить к истинному прежде, чем возвратиться, если это было отменено.

Обработчик событий RunWorureCompleted должен проверить свойство RunWoreyCompletedEventArgs.Canceled , чтобы определить, отменен ли обработчик событий DoWork (установите значение DoWorkEventArgs.Cancel ).

В случае условия гонки может случиться так, что пользователь запросил отмену ( BackgroundWorker.Depending имеет значение true), но работник ее не увидел ( RunWoreyCompletedEventArgs.Canceled имеет значение false). Вы можете проверить эти два свойства, чтобы определить, что это произошло, и сделать все, что вы выбрали (либо рассматривать это как успешное завершение - потому что работник действительно закончил успешно, или как отмену - потому что пользователь отменил и больше не волнует).

Я не вижу никакой ситуации, когда есть какая-либо неясность в том, что произошло.

EDIT

В ответ на комментарий - если существует несколько классов, которые должны обнаружить Pending , нет никакой альтернативы передаче этим классам ссылки на тип, такой как BackgroundWorker , который позволяет им получить эту информацию. Вы можете абстрагировать это в интерфейс, что я обычно делаю, как описано в этом ответе на вопрос о BackgroundWorkers. Однако необходимо передать ссылку на тип, реализующий этот интерфейс, рабочим классам.

Если необходимо, чтобы рабочие классы могли задавать DoWorkEventArgs.Cancel , необходимо либо передать ссылку на это, либо принять другое соглашение (например, логическое возвращаемое значение или пользовательское исключение), которое позволяет рабочим классам указывать, что произошла отмена.

-121--4998555-

Я должен поговорить с этой темой, даже если она старая.

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

Также плохая идея, чтобы приложение выполняло аудит. Аудит должен выполняться на уровне базы данных, иначе вы рискуете потерять часть информации. Данные не изменяются только от приложений в большинстве баз данных; никто не собирается менять цены на все свои продукты по одному из пользовательского интерфейса, когда вам нужно 10% увеличение до всех 10 000 000 из них. Аудит должен отражать все изменения, а не только некоторые из них. Это следует делать в триггере в большинстве баз данных (SQL Server 2008 имеет встроенную функцию аудита). Некоторые из наихудших возможных изменений (сотрудники, совершающие мошенничество или желающие злонамеренно уничтожить данные)также часто бывают из других мест, кроме приложения, особенно если вы разрешаете пользователям доступ на уровне таблицы (что вы не должны делать ни в одной финансовой базе данных или в базе данных, которая содержит личную информацию). Аудит из приложения не уловит это. Разработчики часто забывают, что в защите своих данных внешние источники - не единственная угроза.

10
ответ дан 6 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: