[PL] Wymuszanie domyślnej bazy danych
Jedną z opcji, jakie można określić podczas tworzenia loginów w SQL Server 2005 jest domyślna baza danych dla logina. Domyślna baza to baza, do której login będzie usiłował się dostać po zalogowaniu do serwera. Samo ustawienie domyślnej bazy danych nie niesie za sobą nadania żadnych uprawnień loginowi. Niemniej jednak ustawienie to, na pozór nieistotne, w pewnych wypadkach może okazać się cierniem w oku administratorów.
Pierwsza uwaga - nie można przydzielić loginowi jako domyślną bazę bazy nieistniejącej na serwerze. Próba takiego ustawienia kończy się błędem:
Msg 15010, Level 16, State 1, Line 1
The database '???' does not exist. Supply a valid database name. To see available databases, use sys.databases.
Jednakże po ustawieniu prawidłowej bazy dalej nie ma gwarancji, że przy próbie połączenia nie pojawi się inny błąd wynikający z braku uprawnień:

Taki sam błąd pojawi się niestety także w innej sytuacji - gdy stworzymy login, następnie usuniemy bazę, która została wybrana jako domyślna baza dla tego logina, a wreszcie spróbujemy zalogować się do serwera przy użyciu logina, który w tym momencie nie będzie miał dostępu do domyślnej bazy...
To wszystko sprawia, że czasem chcemy, by domyślną bazą wszystkich loginów była baza master. Jak wymusić takie tworzenie loginów? Najprościej przez stworzenie DDL triggera na poziomie serwera. Przykładowy trigger:
USE master
GO
CREATE TRIGGER trgValidateLogin
ON ALL SERVER
FOR CREATE_LOGIN, ALTER_LOGIN
AS
DECLARE @eventdata XML
SET @eventdata = eventdata()
IF (@eventdata.exist('(/EVENT_INSTANCE/DefaultDatabase[1])[text() != "master"]') = 1)
BEGIN
RAISERROR('Can not create a login with default database other than master.',16,1)
ROLLBACK
END
GO
-- DROP TRIGGER trgValidateLogin ON ALL SERVER
Trigger ten przy próbie stworzenia logina z inną domyślną bazą niż master lub przy próbie zmiany domyślnej bazy dla logina na inną bazę niż master zwróci następujące błędy:
Msg 50000, Level 16, State 1, Procedure trgValidateLogin, Line 9
Can not create a login with default database other than master.
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
Oczywiście, zamiennikiem dla takiego triggera (który może w zostać dodatkowo w prosty sposób rozszerzony o zapisywanie nieudanych prób tworzenia lub zmiany logina) może być szerzenie wśród administratorów tendencji do tworzenia loginów z domyślną bazą master lub uświadamianie użytkowników, że nawet w przypadku ustawienia domyślnej bazy na nieistniejącą ciągle można się zalogować do serwera używając opcji -d narzędzia SQLCMD lub karty Connection Properties dostępnej w oknie logowania aplikacji Management Studio po naciśnięciu przycisku Options (patrz rysunek poniżej).

W niedalekiej przyszłości (SQL Server 2008) dostaniemy mechanizm (Declarative Management Framework), który pozwoli zarządzać takimi obiektami serwera, jak loginy, w prostszy sposób (serwer sam będzie tworzył obiekty pilnujące porządku narzuconego przez DBA).