Есть ли способ написать крюк, который будет запущен до того, как изменения будут переданы в БД доступа? Я ищу способ заблокировать изменения, если конкретный процесс в настоящее время запрашивает БД.Блок, вносящий изменения в базу данных Microsoft Access
ответ
Вы не дали нам много информации для работы. Можете ли вы адаптировать что-то вроде Create and Use Flexible AutoNumber Fields так конкретный процесс сначала открывает таблицу исключительно? Тогда любые другие операции, которые могут изменить данные, должны были ждать, пока они не смогут заблокировать эту же таблицу.
Что такое специфический процесс? У вас есть способ определить, когда/если он считывает данные из вашей базы данных?
Если специфический процесс является внешним по отношению к базе данных, например ASP-код веб-сервера, который использует ADO для извлечения данных, вы можете увидеть, могут ли быть полезны свойства ADO connection и IsolationLevel.
Обновление: Я использовал форму для экспериментов с свойством adModeShareDenyWrite Mode для соединения ADO. Пока форма открыта, другие пользователи могут открывать базу данных, но не вносить никаких изменений. Однако, если другой пользователь уже открыл db, когда форма пытается открыть соединение, он вызывает ошибку.
Возможно, ваш сценарий развертывания может попытаться открыть соединение adModeShareDenyWrite и выполнить ошибку при ошибке.
Option Compare Database
Option Explicit
Dim cn As ADODB.Connection
Private Sub Form_Close()
If Not (cn Is Nothing) Then
cn.Close
Set cn = Nothing
End If
End Sub
Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=\\Cmpq\export\Access\backend\links2003.mdb;" & _
"User Id=admin;Password=;"
cn.Mode = adModeShareDenyWrite
cn.Open
End Sub
Посмотрите на мой комментарий к OP –
Вы пытались запустить определенный процесс с эксклюзивным доступом к базе данных? Это помешало бы другим процессам изменять БД во время его работы. –
Ну, «конкретный» процесс представляет собой набор сценариев развертывания, который вычисляет определенную информацию из базы данных. Но если база данных будет изменена в середине выполнения развертывания, все будет отключено. Я слышал о том, что только чтение db или определенных таблиц может быть выполнено программно из сценариев развертывания, а затем снова включено после завершения развертывания? –
Вы не можете сделать db только для чтения, но вы можете определить, что ваше соединение является эксклюзивным. Как это сделать, зависит от того, как вы получаете доступ к базе данных Jet/ACE (ODBC, ADO/OLEDB). –