C# - MS SQL adatbázis használata CD lemezről

forráskód letöltése
Ha egy olyan alkalmazást készítünk, mely MS SQL adatbázist használ, akkor lehetőségünk van arra is, hogy ezt az adatbázist egy CD lemezen helyezzük el a szükséges szoftverünkkel együtt és így az teljes mértékben CD-ről futtatható.
A mellékelt példa futtatása előtt a 126. és 127. sorban lévő connStr1 és connStr2 változót módosítsa annak érdekében, hogy a Master, illetve a CDData adatbázisok elérhetők legyenek.
Ez esetben természetesen az adatbázis csak olvasható lesz, de ez sok esetben elegendő. Egyetlen telepítendő alkalmazás ilyenkor a MS SQL adatbázis motor (MSDE), minden más (saját alkalmazásunk, az adatbázis, stb.) működhet a CD lemezről.
A mellékelt példához az MS SQL 2000-es verzióját használtuk, de az alább leírtak régebbi verziók esetén is használhatók.
Nézzük első lépésként, miként készíthetünk egy olyan adatbázist, melyet akár egy CD lemezről is használhatunk. Az ehhez tartozó példaprogram megtalálható a mellékelt Step01 könyvtárban.
Az adatbázis létrehozását nem tehetjük meg a hagyományos módokon, hanem ehhez az sp_create_removable nevű tárolt eljárást kell használnunk. Ennek segítségével hozhatjuk létre az ún. mozgatható adatbázist, melyet képesek vagyunk akár CD lemezről is használni. Az ilyen speciális adatbázisok létrehozásánál tudnunk kell, hogy fizikailag három állomány jön létre: egy az adatok tárolásához, egy a napló állomány és egy a rendszer táblák részére. E három állomány adatait kell megadnunk az sp_create_removable tárolt eljárásnak.
Első paraméter az adatbázis logikai neve lesz.
A második a rendszertáblák logikai neve, a harmadik az ehhez tartozó állomány fizikai elérési útvonala és neve, majd az állomány kezdőmérete MB-ban.
Ezt követő három paraméterben a napló állomány logikai neve, fizikai elérési útvonala és neve, valamint az állomány kezdőmérete MB-ban.
Az utolsó három paraméterben az adat állomány logikai neve, fizikai elérési útvonala és neve, valamint az állomány kezdőmérete MB-ban.
sp_create_removable
   'CDData',
   'CDDataSys',
   'c:\CDData.sys',
   1,
   'CDDataLog',
   ' c:\CDData.log',
   1,
   'CDData',
   ' c:\CDData.dat',
   1
Az sp_create_removable futtatásához sysadmin tagság kell.
A létrejövő rendszer táblákat tartalmazó állomány kerül a PRIMARY csoportba, míg a felhasználó adatokat tartalmazó rész egy readonlyfilegroup nevű csoportba. E csoportot az adatok feltöltése után csak olvashatóra kell megváltoztatni.
Az adatbázis létrehozása után feltölthetjük azt a szükséges adatokkal. Először hozzunk létre mondjuk egy táblát:
use CDData
CREATE TABLE UserData
(
  userid int,
  lastlogin datetime
)
Ha már van tábla, akkor helyezzünk el benne adatokat is:
use CDData
INSERT INTO userdata (userid, lastlogin) VALUES (1, CONVERT(DATETIME, '2001-01-01 00:00:00', 102))
INSERT INTO userdata (userid, lastlogin) VALUES (2, CONVERT(DATETIME, '2001-02-01 00:00:00', 102))
Az adat feltöltés után szükség van még egy tárolt eljárás meghívására, mely az sp_certify_removable lesz. Ez a tárolt eljárás ellenőrzi az adatbázist, hogy az megfelel-e arra, hogy mozgatható adatbázis legyen belőle. Szükség esetén képes a megfelelő változtatások elvégzésére is, hogy az adatbázist használhassuk célunknak megfelelően. Első paraméterként az adatbázis nevét kell megadni. Második, nem kötelező paraméter az AUTO szó. Ez esetben a hibajavítás automatikusan megtörténik.
use master
sp_certify_removable CDData, AUTO
A hibajavításra akkor kerül sor, ha az alábbi szabályokat nem tartanánk be az adatbázis feltöltése során:
  • Az adatbázis tulajdonosa az SA (System Administrator) maradjon. Az sp_certify_removable az összes adatbázisban lévő objektum tulajdonosnak az SA-t állítja be.
  • Ne hozzunk létre nem alapértelmezett jogosultságokat, felhasználókat, mert ezek törlésre kerülnek.
  • Ne készítsünk olyan objektumokat, melyek más adatbázis objektumára hivatkoznak, mert ezek is törlésre kerülnek.
Az sp_certify_removable beállítja a readonlyfilegroup csoportot readonly-ra. Régebbi SQL szerverek esetén ezt a lépést nekünk kell megtenni:
use master
ALTER DATABASE CDData MODIFY FILEGROUP readonlyfilegroup READONLY
Az sp_certify_removable futtatásához sysadmin tagság kell.
Az sp_certify_removable futása után az adatbázis Offline módba kerül, így annak állományai már készen állnak arra, hogy CD-re helyezzük őket.
Felhasználás
Következő lépésként nézzük miként tudjuk felhasználni a CD-n lévő adatbázist.
Helyezzük el a három adatbázis állományt egy CD lemezen (a teszthez az is elég, ha átmásoljuk egy másik meghajtóra, vagy könyvtárba).
Másolás előtt célszerű az SQL Server Enterprise Manager-ből a CDData adatbázis hivatkozását törölni a Databases elemei közül, különben nem tudunk majd csatlakozni hozzá CDData névvel, mivel ilyen objektum már létezni fog az adatbázisok között.
Az adatbázist csatlakoztatnunk kell az SQL szerverhez a használat előtt. Ehhez az sp_attach_db tárolt eljárást használhatjuk. Itt első paraméterként az adatbázisunk nevét adjuk meg, majd ezt követően a hozzá tartozó három állomány nevet teljes elérési útvonallal.
sp_attach_db CDData, 'g:\CDData.dat', 'g:\CDData.sys', 'g:\CDData.log'
Ettől a pillanattól kezdve az adatbázis elérhető, használható. Régebbi SQL szerverek esetén még az Offline módot ki kell kapcsolnunk a használat előtt:
sp_dboption CDData, OFFLINE, FALSE
Az adatbázis eléréséhez csatlakoztatnunk kell azt a következő módon: a Master adatbázisban lévő sp_attach_db tárolt eljárást meg kell hívnunk. Paraméterként megadva az adatbázis nevét és azt a három állományt melyet létrehoztunk a fentiekben. Ezt a tárolt eljárást csak egyszer kell meghívunk, a jövőben már csak az adatbázist kell használnunk. Amennyiben valóban CD-ről használjuk az adatbázist, úgy a tárolt eljárás paramétereiben lévő elérési utakat valószínűleg módosítani kell a c:\-ről a CD meghajtó betűjelére. Kipróbáláshoz megfelel a c:\ meghajtó is.
    private void button1_Click(object sender, System.EventArgs e)
    {
      SqlConnection connection1 = new SqlConnection(connStr1);
      connection1.Open();
      SqlCommand c = new SqlCommand(@"sp_attach_db CDData, 'c:\CDData.dat', 'c:\CDData.sys', 'c:\CDData.log'", connection1);                      
      c.ExecuteNonQuery();
      connection1.Close();
    }
Az adatbázis ettől kezdve már épp úgy használható, mint hagyományos esetben, csak arról ne feledkezzünk meg, hogy az adatokat read only-ként kezeljük.
    private void button2_Click(object sender, System.EventArgs e)
    {
      SqlConnection connection2 = new SqlConnection(connStr2);
      connection2.Open();
      SqlDataAdapter da = new SqlDataAdapter("select * from UserData", connection2);                      
      DataTable dt = new DataTable();
      da.Fill(dt);
      dataGrid1.DataSource = dt.DefaultView;
      connection2.Close();
    }