триггер - trigger sql server example




Создание системы аудита; Интерфейс MS Access на сервере SQL Server (8)

Должен быть

select user name(),suser sname()

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

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

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

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

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

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

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


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


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

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

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


select user_name(),suser_sname()

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



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

У нас также есть система баз данных, которая используется исключительно внутри организации и используется для входа в 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-соединение с сервером, используя окна, прошедшие проверку подлинности в строке соединения. Скомпилируйте приложение Access как dbe для защиты кода VB.

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

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

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

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

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

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

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







triggers