Построение системы аудита; Интерфейс MS Access на сервере SQL Server

Итак, в основном я создаю приложение для своей компании, и его НЕОБХОДИМО создать с использованием MS Access, и оно должно быть построено на SQL Server.

Я составил большинство планов, но мне трудно найти способ управлять системой аудита.

Поскольку он используется только для внутреннего использования, и вы даже не сможете прикоснуться к базе данных снаружи здания, мы не используем систему входа в систему, поскольку программа будет использоваться только после того, как пользователь уже вошел в нашу внутреннюю сеть через Active Справочник. Зная это, мы используем систему для автоматического определения имени пользователя Active Directory и его разрешений в одной из таблиц БД, решая, что они могут или не могут делать.

Таким образом, фактическая таблица аудита будет иметь 3 столбца (этот дизайн может измениться, но для этого вопроса это не имеет значения); кто (пользователь Active Directory), когда (время добавления / удаления / редактирования), что (что было изменено)

Мой вопрос в том, как мне с этим справиться. В идеале я знаю, что должен использовать триггер, чтобы невозможно было обновить базу данных без регистрации аудита, однако я не знаю, как я могу таким образом захватить пользователя Active Directory. Альтернативой было бы закодировать его непосредственно в источнике Access, чтобы всякий раз, когда что-то менялось, я запускал инструкцию INSERT. Очевидно, это ошибочно, потому что если что-то случится с Access или база данных затронута чем-то еще, то аудит не будет регистрироваться.

Будем очень признательны за любые советы, примеры или статьи, которые могут мне помочь!

Ответов (11)

Сколько будет пользователей приложения? Есть ли возможность использовать встроенную проверку подлинности Windows для проверки подлинности SQL?

Обновлено : если вы можете предоставить каждому пользователю логин SQL (интегрированный Windows), вы можете выбрать зарегистрированного пользователя с помощью функции SYSTEM_USER.

Я попробовал немного поиграть с Access, чтобы посмотреть, смогу ли я найти для вас способ. Я думаю, вы можете указать новый источник данных для своей таблицы SQL и выбрать Windows NT Authentication в качестве типа подключения.

CREATE TRIGGER testtrigger1
ON testdatatable
AFTER update
AS 
BEGIN
    INSERT INTO testtable (datecol,usercol1,usercol2) VALUES (getdate(),user_name(),suser_sname());
END
GO

вам нужно подключиться со встроенной безопасностью, известной как доверенное соединение, см. ( http://www.connectionstrings.com/?carrier=sqlserver )

Конечно :)

В Access должен быть раздел под названием «Внешние данные» (я использую новую версию Access, поэтому выбор меню может быть другим).

В этом случае должна быть возможность указать соединение ODBC.

У меня есть возможность связать с источником данных, создав связанную таблицу.

Затем я создал источник данных Machine. Я выбрал SqlServer из выпадающего списка. Затем, когда я нажимаю «Далее», меня спрашивают, как я хочу пройти аутентификацию.

Если вы укажете SSPI в строке подключения к Sql, я думаю, что ваши учетные данные Windows предоставлены.

Это работает для вас?


select user_name(),suser_sname()

Дох! Я забыл экранировать свой код.

Должен быть

select user name(),suser sname()

замените пробелы символами подчеркивания

Хорошо, здесь работает. Когда я обновляю свои таблицы, я вижу свои учетные данные Windows. Итак, держу пари, мы пропустили шаг. Позвольте мне собрать 1,2,3 последовательности того, что я сделал, и, возможно, мы сможем отследить, где это ломается для вас.


  1. Создать новую базу данных MSAccess (пусто)
  2. Нажмите на раздел таблиц
  3. Выбрать внешние данные
  4. Выберите базу данных ODBC
  5. Выберите ссылку на источник данных, создав связанную таблицу
  6. Выберите источник данных машины
  7. Выбрать новый ...
  8. Системный источник данных
  9. Выберите SQL Server из списка и нажмите «Далее», «Готово».
  10. Дайте новому источнику данных имя и описание и выберите (локальный) для сервера. Нажмите "Далее.
  11. Выберите «С аутентификацией Windows NT с использованием идентификатора входа в сеть». Нажмите "Далее.
  12. Установите флажок Изменить базу данных по умолчанию на и выберите БД. Нажмите "Далее. Щелкните Готово.
  13. Протестируйте источник данных.
  14. Выберите таблицу, с которой связан триггер, и нажмите OK.
  15. Откройте таблицу в Access и измените одну из записей (триггер не срабатывает при вставке, просто обновляется)
  16. Выберите * из вашей таблицы аудита

У нас также есть система баз данных, которая используется исключительно внутри организации и использует логины Windows NT. Эта функция возвращает имя входа текущего пользователя:

CREATE FUNCTION dbo.UserName() RETURNS varchar(50)
AS
    BEGIN
    RETURN  (SELECT nt_username FROM master.dbo.sysprocesses WHERE spid = @@SPID)
    END

Вы можете использовать эту функцию в своих триггерах.

Мое решение - не позволять Access изменять данные со связанными таблицами.

Я бы только создал пользовательский интерфейс в Access и создал соединение ADO с сервером, используя Windows, аутентифицированные в строке подключения. Скомпилируйте приложение Access как dbe для защиты кода VB.

Я бы не стал вводить оператор SQL, но я бы вызвал хранимые процедуры для внесения изменений в базу данных и создания записи журнала аудита в атомарной транзакции.

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

Получите набор записей с помощью ADO, используя представление с подсказкой NOLOCK, реализованной на сервере, и кэшируйте эти данные в Access для локального отображения. Или получите одну запись и заблокируйте только эту строку для редактирования.

Используя связанные таблицы, ваши пользователи будут блокировать друг друга.

С подключениями ADO у вас не будет проблем с настройкой ODBC для каждого отдельного клиента.

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

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