2012. december 10., hétfő

Az üres séma esete

Üdv Nektek!


Hozta a Mikulás a kérdést, hogy: Milyen dolog már az, hogy ha csinál valaki egy sémát, és elfelejt létrehozni benne egy objektumot, akkor az nem látszik a Management Studióban a táblák között, mint a többi séma?

Hát igen, ez sajnos ilyen. Ha nem csinál az ember később egy táblát (meg semmit) sem abba a sémába, akkor az a kevésbé szakavatott szemek elől bizony eltűnik!

Jogos volt az azonnali kérdés a hallgatóktól, hogy nem kellene-e néha kreálni egy lekérdezést, ami kilistázza az üres sémákat az adatbázisunkban? Hát dehogynem! :)

Nem ússzuk meg egy sima a sys.schemas tábla beolvasással, mert túl sok infót ad vissza, ezért a következőt javaslom:

use [a te adatbázisod]
select * from sys.schemas a
left outer join sys.objects b
ON a.schema_id=b.schema_id
where a.schema_id < 16384 and b.schema_id is null
order by a.schema_id



Egy kis magyarázat:

Left Outer Joint használunk, mert a célunk az, hogy a sys.schema táblában szereplő üres séma neveket kiírjuk. A join jobb oldalán szereplő sys.objects táblánk pedig segít meghatározni azt hogy melyik séma üres és melyik nem. A where feltételben látható 16384-es azonosító a db_ownert jelenti és onnantól emelkedő id-kal kilistázná az összes database rolet (ha nincs használva persze).
Na most  mivel ez engem zavart, ezért kiszűrtem, de ha valaki kiváncsi rá, vegye ki nyugodtan a where feltételből.



(Azt ugye tudjuk, hogy a mi adatbázisunkhoz tartozó összes séma név megnézhető a Databases/Adatbázisunk/Security/Schemas fülön? Persze az hogy üres vagy sem, nem derül ki...)




Jó munkát :)

Balázs