SQLServer Wpis z cyklu „ku pamięci”. Ostatnio szukałem metody odnajdywania w bazie danych wszystkich obiektów systemowych (procedur, widoków, funkcji itp). W przypadku table problem ten jest wręcz trywialny wystarczy wykonać następujące zapytanie:

SELECT *
FROM sysobjects
WHERE [xtype] = 'S'

Jednakże gdy chcemy znaleźć wszystkie systemowe obiekty nie będące tabelami ,człowieka dopada wielkie zdziwienie. Niestety na podstawie samej tabeli sysobjects nie ma możliwości tego zrobić. Przynajmniej mi o tym nic nie wiadomo, ale….wystarczy dodać wykorzystanie małej funkcji systemowej aby określić czy dany obiekt jest systemowy czy nie.

Funkcją ta jest OBJECTPROPERTY(), która jako parametr przyjmuje id obiektu oraz nazwę właściwości. Więcej o samej funkcji znajdziecie tutaj http://msdn.microsoft.com/en-us/library/ms176105.aspx. Z perspektywy tego wpisu interesuje nas następująca opcja IsMSShipped, która określa czy dany obiekt powstał podczas instalacji SQL Server czy też utworzył go użytkownik. A więc podsumowując wystarczy wykonać następujące zapytanie aby otrzymać listę obiektów systemowych:

SELECT *
FROM sysobjects
WHERE ISNULL(OBJECTPROPERTY([id], N'IsMSShipped'), 0) = 1

Lub takie aby otrzymać listę obiektów nie systemowych:

SELECT *
FROM sysobjects
WHERE ISNULL(OBJECTPROPERTY([id], N'IsMSShipped'), 0) = 0