Sprawdzenie kto używa pliku bazy

Opis problemu

Czasami, aby dokonać aktualizacji bazy chcemy mieć wyłączny dostęp do pliku z danymi. Problem pojawia się w momencie kiedy ktoś używa pliku, a nie wiemy kto. Oczywiście powodów wyłączności może być więcej, ale odcinanie użytkowników od danych podczas pracy to proszenie się o kłopoty.

Sam JET informacje o blokadach na pliku przechowuje w pliku ldb lub dla wersji od 2007 w pliku laccdb. Sama informacja w nim zawarta, może być przydatna, ale nie można opierać na niej wiedzy o tym kto jest zalogowany, ponieważ aparat bazy nie usuwa informacji o zwolnieniu blokady. Dobrze opisuje to ten artykuł:
Wprowadzenie to.ldb plików w programie Access 2000

Wskazówka! Podejrzeć zawartość pliku można wykonać poprzez otworzenie go w systemowym notatniku.

Rozwiązanie

Opis rozwiązania jest w tym artykule: How to determine who is logged on to a database by using Microsoft Jet UserRoster in Access 2000
W sumie mógłbym na tym skończyć ten wpis, ale postanowiłem się podzielić swoim narzędziem.
Cel jego powstania był prosty: czasami back-end jest na komputerze/serwerze na którym nie ma MsAccess’a. W pierwszej wersji był to skrypt VBScript, ale ze względu na problemy (zależność od systemu operacyjnego) z dialogiem do wybierania pliku, napisałem go w AutoIt.:

Local $var = FileOpenDialog("Wybierz plik bazy danych", @WorkingDir & "\", "Access 2000-2003 (*.mdb)|Access 2007 (*.accdb)", 1 + 4)
If not @error Then
    $var = StringReplace($var, "|", @CRLF)
	$cn =  ObjCreate("ADODB.Connection")
	If StringRight($var,3)="mdb" Then
		$cn.Provider = "Microsoft.Jet.OLEDB.4.0"
	Else
		$cn.Provider = "Microsoft.ACE.OLEDB.12.0"
	EndIf
    $cn.Open($var)
	$rs = $cn.OpenSchema(-1,Default,"{947bb102-5d43-11d1-bdbf-00c04fb92675}")
	$file=FileOpen(@ScriptDir & "\WhoOnLine.txt", 2)
	FileWriteLine($file,"Uzytkownicy zalogowani do bazy:" & $var)
	FileWriteLine($file,"-----------------------------------------------------------------------")
	FileWriteLine($file,$rs.Fields(0).Name & @TAB & $rs.Fields(1).Name & @TAB & $rs.Fields(2).Name & @TAB & $rs.Fields(3).Name)
    While Not $rs.EOF
        FileWrite($file,$rs.Fields(0).value & @TAB)
        FileWrite($file,$rs.Fields(1).value & @TAB)
        FileWrite($file,$rs.Fields(2).value & @TAB)
        FileWrite($file,$rs.Fields(3).value)
        FileWrite($file,@CRLF)
        $rs.MoveNext
    Wend
	FileClose($file)
	run("notepad.exe """ & @ScriptDir & "\WhoOnLine.txt")
	$rs.close
	$cn.close
EndIf

Działanie jest proste:

1. Wskazuje ścieżkę do pliku mdb/accdb
2. Zależnie od typu bazy wybieram odpowiedniego providera
3. Tworzę plik wynikowy w folderze skryptu
4. Czytam informacje o zalogowanych użytkownikach
5. Otwieram wygenerowany plik w notatniku

Cała reszta wiedzy jest w artykule powyżej.

Podsumowanie
Dla zainteresowanych wersja skompilowana exe jak i sam skrypt do pobrania, ze swojej strony zachęcam do zapoznania się ze środowiskiem skryptowym AutoIt, bardzo przydatne do robienia narzędziowych skryptów i kompilowania do plików wykonywalnych exe.

Leave a Comment

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera
Skip to toolbar