
A példához szükséges a SampleDatabase07 adatbázis, melyet a mellékelt SampleDatabase07.sql lefuttatásával hozhatunk létre. A SampleDatabase07.sql script 5. sorában adja meg helyesen a létrehozandó adatbázisfájlok mappájának nevét és elérési útvonalát.
A rendszertábla az adattáblák egyes oszlopaihoz deklarált különböző típusú megszorítások, és indexek bejegyzéseit tartalmazza. Minden sor egy indexnek felel meg, a tárolt tulajdonságok igen sokfélék. Gyakorlatilag helyettesíti a syskeys rendszertáblát, de kompatibilitási okokból ez utóbbit is megtartották.
Nézzük meg, milyen oszlopokban tárolja az információkat a rendszertábla:
| Sorszám |
Oszlopnév |
Típus |
Leírás |
| 1 |
id |
int |
Tábla azonosítója, melyhez az index tartozik. |
| 2 |
status |
int |
Belső rendszerállapotot kifejező érték. |
| 3 |
first |
binary(6) |
Mutató az első, vagy gyökérlapra. |
| 4 |
indid |
smallint |
Index azonosítója. Értékei: 1 – az index nyaláboló (létrehozása CLUSTERED kulcsszóval történt), >1 – az index nem nyaláboló, 255 – olyan táblához tartozik, melynek van text, vagy image típusú oszlopa. |
| 5 |
root |
binary(6) |
Indid >=1 és indid < 255 értékkel rendelkező indexek esetén mutató a gyökérlapra. Indid = 1 vagy indid = 255 értékkel rendelkező indexek esetén mutató az utolsó lapra. |
| 6 |
minlen |
smallint |
Sor minimális mérete. |
| 7 |
keycnt |
smallint |
Kulcsok száma. |
| 8 |
groupid |
smallint |
Fájlcsoport azonosító, melyben az index létrejött. |
| 9 |
dpages |
int |
Indid=0 vagy indid=1 esetén a használt lapok száma, míg indid=255 esetén nulla. Egyéb esetekben az indexlapok száma. |
| 10 |
reserved |
int |
Indid=0 vagy indid=1 esetén az indexek és táblaadatok számára lefoglalt lapok száma; indid=255 esetén a text és image adatok számára lefoglalt lapok száma. |
| 11 |
used |
int |
Indid=0 vagy indid=1 esetén az összes használt lap; indid=255 esetén a text és image adatok számára lefoglalt lapok száma. |
| 12 |
rowcnt |
bigint |
Adatok sorainak száma. Indid=255 esetén nulla. |
| 13 |
rowmodctr |
int |
Az utolsó statisztikai frissítés óta beszúrt, törölt vagy módosított sorok száma (UPDATE STATISTICS utasítás kiadása óta). |
| 14 |
xmaxlen |
smallint |
Sorok maximális hossza. |
| 15 |
maxirow |
smallint |
Nem-levélblokkos indexeket tartalmazó sorok maximális hossza. |
| 16 |
OrigFillFactor |
tinyint |
Eredeti FillFactor értéke az indexnek, melyre az index újra –deklarálásakor lehet szükség. |
| 17 |
reserved1 |
tinyint |
Fenntartott. |
| 18 |
reserved2 |
int |
Fenntartott. |
| 19 |
FirstIAM |
binary(6) |
Fenntartott. |
| 20 |
impid |
smallint |
Fenntartott. |
| 21 |
lockflags |
smallint |
A zárolások indexre vonatkoztatott korlátozásainak a jelzésére. |
| 22 |
pgmodctr |
int |
Fenntartott. |
| 23 |
keys |
varbinary(813) |
Az indexet alkotó oszlopok oszlop-azonosítói. |
| 24 |
name |
sysname |
Indid=1 és indid=255 esetén a tábla neve, egyéb esetekben az index neve. |
| 25 |
statblob |
image |
Statisztika tárolására. |
| 26 |
maxlen |
int |
Fenntartott. |
| 27 |
rows |
int |
A lefelé kompatibilitás miatt megtartott érték. |
A példaprogramban bemutatjuk, milyen sorok íródnak a sysindexes rendszertáblába, ha programból indexeket hozunk létre egy adott táblához.
A mellékelt alkalmazásban a SampleDatabase07.sql parancsállomány lefuttatása után két tábla kerül az adatbázisba: Products és Orders. Mindkettő tartalmaz elsődleges kulcs megszorításokat az index-oszlopaikra, melyek neve PK_Products és PK_Orders. Ezek már az adatbázis létrehozásakor beíródnak a rendszertáblába, a program indításakor ezek láthatók csak.
Az adatbázisba került két tárolt eljárással hozhatók létre új indexek, illetve törölhetők a meglévők (CreateIndex és DropIndex).
Az alkalmazás Form-ján található füleken találjuk meg ’Rendszertáblák’ felirat alatt a sysindexes tábla aktuális adatait egy DataGrid kontrolban. Az ’Indexek létrehozása’, illetve ’Indexek törlése’ feliratú gombokkal indíthatók a fenti eljárások.
A fül alsó táblájában a sp_helpindex rendszerfüggvényt használjuk ComboBox vezérlőben kiválasztott táblanévvel, mint bemenő paraméterrel. A rendszerfüggvény információkat ad vissza táblázatos formában az adott tábla indexeiről. Használata:
sp_helpindex [ @objname = ] 'name'
A bemenő paraméter az adatbázis egy táblájának neve karakteres formában, melynek maximális értéke 776. Visszatérési értéke sikeres lekérdezés esetén 0, egyébként 1.
A visszaadott értékek táblázatosan a következők:
| Oszlop neve |
Adattípusa |
Jellemzői |
| index_name |
sysname |
Index neve. |
| index_description |
varchar(210) |
Leírása, jellemzői szövegesen. |
| index_keys |
nvarchar(2078) |
Tábla, vagy nézet, melyre az index létrejött. |
A mellékelt alkalmazásban az adatbázisba került tárolt eljárásban hívjuk meg a sp_helpindex rendszerfüggvényt, ennek neve GetInfo.
A sp_helpindex használata a következőképpen történik:
DECLARE @objname nvarchar(776)
SET @objname = ’Products’
EXEC sp_helpindex @objname
A MS SQL Server 2000 SQL Query Analyzer segédprogramjában végrehajtva a fenti eljárást – természetesen azt követően, hogy létrehoztuk az indexeket - a következő eredményt kapjuk:
| INDEX_NAME |
INDEX_DESCRIPTION |
INDEX_KEYS |
| PK_Products |
clustered, unique, primary key located on PRIMARY |
ProductID |
| PN_Index |
nonclustered located on PRIMARY |
ProductName |
Az adott táblában megadott indexek és kulcsok természetesen a MS SQL Enterprise Manager programjának grafikus felületén is megtekinthetők.
A mellékelt programban a ComboBox kontrol indexének megváltozásakor, vagyis amikor új értéket választunk, frissülnek a tábla értékei. Ennek érdekében a BuildInfo nevű saját metódusban a visszaadott adatokat betöltjük egy DataTable objektumba, majd adatforrásként értékül adjuk a DataGrid kontrolnak.
A metódust használjuk a program indításakor is. Az első sorokban így létrehozáskor oszlopokat csatolunk a táblához. Ezek a sorok újratöltéskor nem futnak le:
infoTable = new DataTable();
DataColumn dc1 = new DataColumn("INDEX_NAME", Type.GetType("System.String"));
DataColumn dc2 = new DataColumn("INDEX_DESCRIPTION", Type.GetType("System.String"));
DataColumn dc3 = new DataColumn("INDEX_KEYS", Type.GetType("System.String"));
infoTable.Columns.Add(dc1);
infoTable.Columns.Add(dc2);
infoTable.Columns.Add(dc3);
Újratöltéskor mindig töröljük az addig beírt adatokat. A táblába egy metódus végrehajtásának eredményeként kerülnek az adatok, mely a GetInfo tárolt eljárást hajtja végre. Bemenő paramétere a tábla neve:
DataRow dr;
...
io.Parameters["@tablename"].Value = tblCombo.Text;
SqlDataReader reader = io.ExecuteReader();
Az egyes sorok oszlopait a SqlDataReader objetum egyes mezőinek kiolvasott értékeivel töltjük fel:
while (reader.Read())
{
dr=infoTable.NewRow();
dr["INDEX_NAME"] = reader.GetSqlString(0);
dr["INDEX_DESCRIPTION"] = reader.GetSqlString(1);
dr["INDEX_KEYS"] = reader.GetSqlString(2);
infoTable.Rows.Add(dr);
}
...
A CreateIndex és DropIndex tárolt eljárások paraméter nélküliek, végrehajtásuk után a sysindexes rendszertáblába bekerülnek, vagy törlődnek adatsorok, így a megjelenítő DataGrid kontrol tartalmát egyszerűen frissítjük. A DataGrid kontrolban csak az említett Products és Orders táblákkal kapcsolatos bejegyzések kerülnek megjelenítésre.
Az adattáblák értékei az ’Adattáblák’ feliratú fül alatt elhelyezett DataGrid kontrolokban láthatók.