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

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

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

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

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

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

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

15.08.2008 19:35:13
Тьфу не работает, все еще добавляя те же вещи через триггер. Также я должен упомянуть, что я использую ODBC для подключения ...
Andrew G. Johnson 13.02.2011 13:51:16
11 ОТВЕТОВ

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

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

0
16.08.2008 01:13:39
@KevinKenny Я бы сказал что-то вроде 10-30 с потенциалом для большего в будущем. Я никогда не слышал и не использовал встроенную проверку подлинности Windows для сервера SQL. Это легко / безопасно? Такие вещи могут быть сложнее продать боссу. : /
Andrew G. Johnson 13.02.2011 13:51:02

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


select user_name(),suser_sname()

Doh! Я забыл избежать моего кода.

2
15.08.2008 19:49:03

Так должно быть

select user name(),suser sname()

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

0
15.08.2008 19:49:23
LOL, как неловко, это также отвечает на мой неписаный вопрос о том, что случилось с курсивом? Я не уверен, будут ли они работать или просто вернут имя пользователя, которое я использую для подключения приложения Access к базе данных, которое одинаково для всех - есть ли какой-то способ использовать Active Directory как часть процесса аутентификации сервера SQL? В любом случае я собираюсь провести несколько тестов, чтобы убедиться, что это действительно так.
Andrew G. Johnson 13.02.2011 13:52:47

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

1
15.08.2008 19:53:32
Я. Эти две команды сделали то, что я подозревал, и просто вернули то же самое для всех. Я не использую строку подключения; как я уже говорил ранее, я использую Access и просто использую связанные таблицы для подключения к моей базе данных.
Andrew G. Johnson 13.02.2011 13:53:09

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

0
15.08.2008 20:02:55
это единственный способ? Придется ли мне менять всю модель связанных таблиц? Честно говоря, я даже не знаю, как интегрировать строку подключения в Access ...
Andrew G. Johnson 13.02.2011 13:49:43

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

1
15.08.2008 20:07:23
Джей, не могли бы вы рассказать немного подробнее о том, КАК вы это сделали ... просто чтобы начать, я не совсем понимаю вас. Будет ли это все еще работать, мне все еще нужно пройти аутентификацию на сервере SQL, чтобы выполнять запросы.
Andrew G. Johnson 13.02.2011 13:53:23

Конечно :)

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

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

Я получаю опцию Ссылка на источник данных путем создания связанной таблицы.

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

1
15.08.2008 20:18:38
CREATE TRIGGER testtrigger1
ON testdatatable
AFTER update
AS 
BEGIN
    INSERT INTO testtable (datecol,usercol1,usercol2) VALUES (getdate(),user_name(),suser_sname());
END
GO
1
15.08.2008 20:46:22

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


  1. Создать новую базу данных MSAccess (пусто)
  2. Нажмите на раздел таблиц
  3. Выберите внешние данные
  4. Выбрать базу данных ODBC
  5. Выберите ссылку на источник данных, создав связанную таблицу
  6. Выберите источник данных машины
  7. Выберите новый ...
  8. Системный источник данных
  9. Выберите SQL Server из списка и нажмите Далее, Готово.
  10. Дайте новому источнику данных имя и описание и выберите (локально) для сервера. Нажмите "Далее.
  11. Выберите «С аутентификацией Windows NT с использованием идентификатора входа в сеть». Нажмите "Далее.
  12. Установите флажок Изменить базу данных по умолчанию и выберите БД. Нажмите "Далее. Нажмите Готово.
  13. Проверьте источник данных.
  14. Выберите таблицу, с которой связан Trigger, и нажмите OK.
  15. Откройте таблицу в Access и измените одну из записей (триггер не срабатывает при вставке, просто обновление)
  16. Выберите * из таблицы аудита
2
15.08.2008 20:58:46
Ну, видимо, я идиот, потому что, кажется, работает. Я хотел попробовать его на другой учетной записи, но, конечно, никто с установленным Access все еще здесь, и я не могу создать новую учетную запись. Тьфу, в любом случае должно работать - с окончательными результатами, которые будут опубликованы в понедельник! Спасибо за помощь.
Andrew G. Johnson 13.02.2011 13:53:42

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

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

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

1
15.09.2008 23:24:36

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

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

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

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

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

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

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

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

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

0
16.09.2008 03:02:04