Захват пользователя, который меняет базу данных
Я работаю над несколькими проектами, внешний интерфейс которых недавно был перенесен на 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 получает пользователя:
- через SQL, который содержит столбец пользователя и данные
"insert into ... values('" & user & "', ...."
- с помощью отдельного вызова аудита, который содержит имя пользователя
- через хранимую процедуру, где 1 параметр может быть выделен для передачи информации о пользователе