Построение системы аудита; Интерфейс MS Access на сервере SQL Server - PullRequest
4 голосов
/ 15 августа 2008

Таким образом, в основном я создаю приложение для своей компании, и оно должно быть создано с использованием MS Access, и оно должно быть построено на SQL Server.

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

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

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

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

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

Ответы [ 11 ]

2 голосов
/ 15 августа 2008

Это у вас работает?


select user_name(),suser_sname()

Doh! Я забыл уйти от своего кода.

2 голосов
/ 16 августа 2008

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


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

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

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

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

1 голос
/ 16 августа 2008
CREATE TRIGGER testtrigger1
ON testdatatable
AFTER update
AS 
BEGIN
    INSERT INTO testtable (datecol,usercol1,usercol2) VALUES (getdate(),user_name(),suser_sname());
END
GO
1 голос
/ 16 августа 2008

Конечно:)

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

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

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

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

1 голос
/ 16 августа 2008

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

1 голос
/ 15 августа 2008

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

0 голосов
/ 16 сентября 2008

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

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

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

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

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

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

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

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

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

0 голосов
/ 16 августа 2008

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

0 голосов
/ 15 августа 2008

должно быть

select user name(),suser sname()

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

...