Delphi - Adatbázisok mentése és helyreállítása SQLDMO-val

forráskód letöltése
Az SQL-DMO (Distributed Management Object) az SQL Server belső objektumainak COM reprezentációja. Része az SQL-DMF-nek, vagyis a Distributed Management Framework-nek. Az SQL-DMF olyan objektumok és szervizek gyűjteménye, melyek az SQL Server működtetését és karbantartását célozzák. Megannyi adminisztrációs teendő végezhető el az objektumokkal, többek közt mentéseket készíthetünk a kiválasztott adatbázisról, valamint vissza is állíthatjuk azt. Cikkünkben megvizsgáljuk, hogyan tehető ez meg.
A Microsoft SQLDMO Object Library alapértelmezésben nem kerül telepítésre a számítógép merevlemezére. A program használata előtt győződjön meg róla, hogy a komponens rendelkezésre áll.
A SQLDMO elérésére azt a módszert választjuk, hogy az IDispatch OLE osztályon keresztül szólítjuk meg a szervert.
uses
  ComObj;
var
  SQL_DMO: Variant;
begin
  SQL_DMO := CreateOLEObject('SQLDMO.SQLServer');
  ...
end;
Amikor a CreateOleObject metódust hívjuk, paraméterként a program azonosítóját kell megadni (ProgID). Ez az SQL_DMO Automation szerver esetében 'SQLDMO.SQLServer'. Ezen azonosító alapján keresi ki a rendszer a registry-ből az Automation szerver CLSID-jét, vagyis egyedi osztályazonosító kódját. Utána ellenőrzi, hogy a hivatkozott szerver be van-e töltve a memóriába, és ha nincs, betölti, majd megkeresi az Automation szerver interfészét. A CreateOleObject metódus visszatérési értéke erre az interfészre mutató pointer lesz. Miután visszakaptuk az interfész címét, elkezdhetjük hívogatni az Automation szerver metódusait.
Fontos, hogy hivatkozzunk a ComObj unit-ra, ez tartalmazza ugyanis az OLE Automation szerverek eléréséhez szükséges rutinokat. Amikor kiadjuk a CreateOLEObject utasítást, a Delphi valójában több ComObj-beli eljárást hív meg (VarDispInvoke, DispatchInvoke, GetIDsOfNames).
A mellékelt példában két műveletet végzünk el.
Adatbázisok neveinek lekérdezése
Az első műveletben kigyűjtjük a számítógépre telepített SQL Server-en megtalálható adatbázisok neveit, hogy egyszerűen kiválaszthassuk azt, amelyiket menteni, vagy helyreállítani szeretnénk. Csatlakoznunk kell tehát a szerverre. A csatlakozás egyszerűen megy. Miután létrehoztuk az SQL_DMO nevű interfészt, beállítunk egy-két paramétert, majd meghívjuk a Connect metódust.
A Connect metódus három opcionális paraméteréből (szervernév, login név, jelszó) mi most az elsőt adjuk meg, jelzendő, hogy a lokális szerverre kívánunk csatlakozni.
SQL_DMO := CreateOLEObject('SQLDMO.SQLServer');
SQL_DMO.LoginSecure := true;
...
SQL_DMO.Connect('.');
Ellenőrizzük le, hogy felépült-e a kapcsolat: Erre a VerifyConnection metódust használhatjuk, és paraméterként megadhatjuk, hogy sikertelen kísérlet esetén mi történjen. Az SQLDMOConn_ReconnectIfDead érték azt jelenti, hogy sikertelen kapcsolatfelvétel esetén az alkalmazás újra próbálkozik.
SQL_DMO.VerifyConnection(SQLDMOConn_ReconnectIfDead)
...
Sikeres csatlakozás után indulhat a lekérdezés. A Databases objektum tartalmazza a szerver adatbázisait. A Count property az adatbázisok számát, az Items tömb magukat az adatbázisokat mutatja. Végigmegyünk a Databases kollekción, és minden adatbázis nevét egy ComBox-ba írjuk.
SQL_DMO.Databases.Refresh(true);
for i := 1 to SQL_DMO.Databases.Count do begin
  comboBox2.Items.Add(SQL_DMO.Databases.Item(i, null).name);
end;
Mentés/ helyreállítás művelete
A mentéshez ki kell választanunk egy adatbázisnevet, a műveletet a listában, majd meg kell nyomnunk a Művelet gombot. Ekkor létre kell hoznunk egy példányt a SQLDMO.Backup típusból, melynek metódusa végzi el a mentést.
BackUp := CreateOLEObject('SQLDMO.Backup');
Megadjuk, hogy az adatbázis állományairól készüljön a mentés, és hogy a mentendő állomány a szövegmezőben megadott nevet viselje.
BackUp.Devices := BackUp.Files;
BackUp.Files := edit1.Text;
Meg kell adnunk az adatbázis nevét, majd a SQLBackup metódussal elvégezni a mentést.
BackUp.Database := comboBox2.Text;
BackUp.SQLBackup(SQL_DMO);
A mentés – amennyiben nem adunk meg mást, csak fájlnevet – az MS SQL Server mappájában található Backup alkönyvtárba kerül.
Az adatbázis helyreállításához az SQLDMO.Restore osztályt kell példányosítanunk.
Restore := CreateOLEObject('SQLDMO.Restore');
Itt is specifikálnunk kell a helyreállítandó objektumokat, és hogy a mentett állomány hol található.
Restore.Devices := Restore.Files;
Restore.Files := edit1.Text;
Majd miután megadtuk, hogy melyik adatbázist kívánjuk helyreállítani, illetve a művelet milyen természetű legyen (vagyis hogy az adatbázis elérhető állományai felülíródjanak), az SQLRestore metódussal végezzük el a helyreállítást.
Restore.Database := comboBox2.Text;
Restore.ReplaceDatabase := true;
Restore.SQLRestore(SQL_DMO);