Centrum skryptów - Systemy operacyjne

Jak otrzymywać informację na temat przekroczenia przez bazę danych programu Access określonego rozmiaru?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak otrzymywać informację na temat przekroczenia przez bazę danych programu Access określonego rozmiaru?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak uruchomić powiadomienie, które informowałoby mnie za każdym razem, gdy plik bazy danych Access przekroczy jakiś rozmiar?

-- MA

Cześć Skrypciarze! Odpowiedź

Cześć, MA! Nie wiem czy wiesz, ale ostatnio firma Microsoft zamieściła w swojej witrynie stronę 100 Reasons You'll Be Speechless (j.ang.), na której wymienia 100 powodów, dla których program Windows Vista wprawi Cię w osłupienie.

Uwaga: Naszym ulubionym powodem jest powód nr 7: „Możesz zatrzymać czas!” Fajnie to brzmi, tylko próbowaliśmy doszukać się tam jakiegoś sposobu również na ponowne uruchomienie czasu, ale nic z tego. Godny pochwały jest także nr 13: „W mig poznasz naciągacza i kawalarza”. Nie wiem, czy jest to nawiązanie do nas, całkiem możliwe, bo obok zamieścili nasze zdjęcie. Ale to dość słaba gra słów, bo słowo „kawalarz” i „skrypciarz” wcale się nie rymuje. Autorowi wystawiamy język. Kawalarzem to on na pewno nie jest.

Mniejsza z tym. Stwierdziliśmy, ze jest to dość dobry moment na autoreklamę i podajemy niniejszym 100 powodów, dzięki którym artykuły z serii „Cześć, Skrypciarze!” wprawiają Cię w osłupienie:

  1. Możesz zatrzymać czas!
  2. „Cześć, Skrypciarze!” to źródło niewyczerpanych anegdot o Skrypciarskim Synu oraz jego karierze baseballowej.
  3. W innych redakcjach redaktorzy wysilają się, aby styl artykułów był poważny i pozbawiony humoru. Nasza pani Redaktor nie wie nawet, że mogłaby to robić (powiedzieliśmy jej, ze klawisz „delete” jest popsuty, więc dlaczego nie miałaby nam uwierzyć?).
  4. Możesz zatrzymać czas! (To, że wydaje Ci się, ze czytałeś już to zdanie jest efektem tego, że mózgowo nadal znajdujesz się z tym zdaniu i tak naprawdę zatrzymałeś czas).
  5. Możesz zatrzymać czas!

Uwaga od Redakcji: Wymazaliśmy pozostałe 95 punktów, w których napisane było „Możesz zatrzymać czas!”. Po pierwsze, jest to strata czasu czytelnika, a po drugie Skrypciarzowi płacimy od słowa.

  • 101. Ponieważ możesz znaleźć tu skrypt, który uruchomi powiadomienie za każdym razem, gdy jakiś plik w bazie danych Access przekroczy jakiś żądany rozmiar.

Czyli następujący skrypt:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colMonitoredEvents = objWMIService.ExecNotificationQuery _

    ("SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE " _

        & "TargetInstance ISA 'CIM_DataFile' and " _

            & "TargetInstance.Name='C:\\Scripts\\Test.mdb'")



Do

    Set objLatestEvent = colMonitoredEvents.NextEvent

    If objLatestEvent.TargetInstance.FileSize > 204800 Then

        Wscript.Echo "The Access database file has exceeded its allowed size."

    End If

Loop

Zaczynamy od połączenia się z usługą WMI na komputerze lokalnym; skrypt zadziała oczywiście także na komputerze zdalnym. Trzeba tylko przypisać nazwę danego komputera zdalnego zmiennej strComputer:

strComputer = "atl-dbs-01"

To sprowadza nas do jakże długiego wiersza kodu:

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _

    ("SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE " _

        & "TargetInstance ISA 'CIM_DataFile' and " _

            & "TargetInstance.Name='C:\\Scripts\\Test.mdb'")

Bez paniki – ten wiersz kodu tworzy coś, co możemy nazwać „subskrypcją” wskazanego zdarzenia WMI. Które zdarzenie będziemy subskrybować? Chcemy być powiadamiani za każdym razem, gdy powstanie nowe wystąpienie klasy __InstanceModificationEvent; takie wystąpienie tworzone jest za każdym razem, gdy jakiś obiekt klasy WMI (np. proces, usługa, plik) jest w jakiś sposób modyfikowany. Nie to jest jednak naszym celem, gdyby było, to dostawalibyśmy powiadomienia o modyfikowaniu mniej więcej co sekundę. Chcemy być informowani tylko wówczas, gdy wystąpienie TargetInstance (czyli nowe wystąpienie klasy __InstanceModificationEvent) spełni następujące kryteria:

  • TargetInstance będzie należał do klasy CIM_DataFile (czyli będzie to po prostu plik, a nie coś innego – folder, proces, itp.)
  • TargetInstance będzie miał nazwę (Name) równą C:\\Scripts\\Test.mdb. Właściwość Name jest ekwiwalentem ścieżki pliku. A skoro tak, to czy właściwość Name nie powinna mieć wartości C:\Scripts\Test.mdb? No cóż, szczerze mówiąc tak właśnie jest. Jednak za każdym razem, kiedy w instrukcji Where pojawia się znak \, należy go oznaczyć, poprzedzając drugim takim samym znakiem. To dlatego zamiast „C:\Scripts\Test.mdb” mamy: „C:\\Scripts\\Test.mdb”.

Czym zaś jest Test.mdb? To nic innego, jak tylko plik bazy danych programu Access, któremu przyglądamy się uważnie, sprawdzając, czy nie jest aby naciągaczem ani kawalarzem.

Uwaga: Dobre spostrzeżenie! Do czego używa się fragmentu kwerendy WITHIN? Instruuje ona po prostu skrypt, aby sprawdzał co 30 sekund, czy plik bazy danych został zmodyfikowany (czyli czy nie powstało nowe wystąpienie klasy __InstanceModificationEvent, które spełnia powyższe kryteria). Nie ma nic magicznego w wartości 30, oznacza to tylko, że jeżeli plik został zmodyfikowany, otrzymamy powiadomienie w ciągu 30 sekund. Jeżeli to dla nas za dużo (powód 102: Nasze artykuły zawierają łącze (j.ang.) webcastu, w którym bardzo szczegółowo omawiamy zdarzenia WMI oraz całą terminologia związaną z WMI), to można tę wartość oczywiście zmienić.

Po subskrypcji serwisu usług WMI, uruchamiamy pętlę, która będzie działać… no w sumie to będzie działać po wsze czasy (zwróćcie uwagę, ze nie ma tu kryterium wyjścia, zupełnie jak z zatrzymanym czasem). Wewnątrz pętli używamy następującego wiersza kodu, który poinstruuje skrypt, żeby czekał spokojnie aż do następnego zdarzenia modyfikacji (lub przynajmniej do wystąpienia zdarzenia, które subskrybowaliśmy):

Set objLatestEvent = colMonitoredEvents.NextEvent

Co się stanie, jeżeli takie zdarzenie nigdy nie będzie miało miejsca? No w sumie nic, skrypt będzie sobie siedział cichutko i czekał, i czekał, i czekał… Gdy jednak się doczeka i powstanie takie wystąpienie modyfikacji, to następujący wiersz kodu sprawdzi, czy przypadkiem właściwość FileSize nie jest większa niż 204 800 bajtów:

If objLatestEvent.TargetInstance.FileSize > 204800 Then

Znowu, wartość 204 800 nie jest obligatoryjna, musieliśmy wybrać jakiś docelowy rozmiar pliku i wybraliśmy właśnie ten. Jak zapewne się domyślacie, 204 800 bajtów to 200 kilobajtów: 200 * 1024.

Co jeżeli rozmiar pliku przekroczy 204 800 bajtów? Znowu nic zaskakującego, nasz przykładowy skrypt po prostu zwróci następujący komunikat:

Wscript.Echo "The Access database file has exceeded its allowed size."

Potem pętla przechodzi znowu aż do momentu, kiedy nastąpi następne takie zdarzenie.

Jeszcze kilka słów, zanim skończymy ten jakże fascynujący artykuł. Skrypt działa najlepiej, jeżeli uruchomimy go w oknie polecenia z hostem CScript; dzięki temu nie będą nam wyskakiwały okna komunikatów i będzie można zakończyć działanie skryptu po prostu zamykając dane okno polecenia. Ponadto można bez trudu modyfikować skrypt tak, aby wykonywał jakieś bardziej skomplikowane działania; można na przykład zapisać zdarzenie w dzienniku (j.ang.) lub wysłać wiadomość email (j.ang.) za pomocą SMTP.

A przy okazji, MA – wiemy, że używasz programu Microsoft Operations Manager (MOM). Mamy nadzieję, że uda Ci się zmodyfikować podany powyżej kod tak, aby włączał alerty programu MOM. W razie jakichś problemów, po prostu do nas napisz, a może znajdziemy jakiś sposób, aby Ci pomóc.

Żywimy nadzieję, że wszystkie powyższe rady były pomocne i są 103 powodem, dla którego warto czytać artykuły na stronie „Cześć, Skrypciarze!”. Dalej nie wiemy jednak, co u naszych kolegów ze skrypciarskiej ekipy. Wiemy tylko, że Peter Costantini usilnie próbuje zatrzymać czas, bo przechodzi właśnie przez proces „starzenia się”. Mój drogi! Czas zatrzymuje się tylko na łamach „Cześć, Skrypciarze!” Mogłeś nie odchodzić. Nasza Skrypciarska Pani Redaktor ma już ponad sto lat, a wygląda jedynie na 90!

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne