Захват пользователя, который меняет базу данных

Я работаю над несколькими проектами, внешний интерфейс которых недавно был перенесен на vb.net. .accdb формат.

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

Есть ли способ передать эту информацию из внешнего интерфейса в базу данных? Или есть способ заставить серверную часть взглянуть на функцию, которая там хранится (в данный момент она не работает)

Это код, который у меня есть на спине

Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public Function GetUserName() As String
' Returns the network login name
Dim lngLen As Long, lngX As Long
Dim strUserName As String
    strUserName = String$(254, 0)
    lngLen = 255
    lngX = apiGetUserName(strUserName, lngLen)
    If lngX <> 0 Then
        GetUserName = Left$(strUserName, lngLen - 1)
    Else
        GetUserName = ""
    End If
End Function

У меня есть публичная функция, делающая то же самое во внешнем интерфейсе, также называемая getusername()

1 ответ

Мой друг, здесь мы говорим о принципиальных различиях между работой в закрытой среде MS Access, не только в качестве базы данных, но и приложения. Так как все внутри Access является родным для себя, у вас есть доступ ко всем внутренностям. Теперь вы уходите от этой модели, и ваш дизайн должен измениться соответственно. Здесь вы находитесь, давайте назовем это клиент-серверной средой, и клиент мало что знает, кроме строки подключения, а сервер ничего не знает о клиенте.

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

В зависимости от модели безопасности вы используете либо имя пользователя компьютера, либо имя пользователя приложения. Но у вас это есть - в VB это легко.

Не зная вашего Audit Структура, я могу сказать, что, как это обычно делается, когда данные меняются, вы создаете транзакцию Sql, используя Ado.Netи в рамках этой транзакции вы вставляете данные аудита, а затем выполняете CRUD на реальных данных. Тогда вы делаете. Таким образом, вы либо преуспеваете, либо терпите неудачу оба - никакие данные не изменяются без аудита

Теперь еще один шаг - добавить в свою таблицу (если у вас ее еще нет) 4 поля:

CreatedBy, CretedDate, ModifiedBy, ModifiedDate.

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

И вот как ваш Access Db получает пользователя:

  1. через SQL, который содержит столбец пользователя и данные "insert into ... values('" & user & "', ...."
  2. с помощью отдельного вызова аудита, который содержит имя пользователя
  3. через хранимую процедуру, где 1 параметр может быть выделен для передачи информации о пользователе
Другие вопросы по тегам