Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc

[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).

Opublikowane 5 listopada 2007 20:57 przez brejk

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

# re: Wymuszanie domyślnej bazy danych

28 lutego 2008 16:56 by roku

z default database wiąże się jeszcze jedna płapka, jak ustawiona na domyślną baza się wywali to nawet z administracyjnymi prawami nie można się do niej zalogować i DBA ma problem ;)

# re: [PL] Wymuszanie domyślnej bazy danych

11 maja 2008 15:00 by ja

ktos ma pomysł jak się zalogować na serwer gdy jedyny użytkownik który miał prawa ma uszkodzoną bazę domyślną?

# re: [PL] Wymuszanie domyślnej bazy danych

10 czerwca 2008 09:51 by brejk

@ja: Zmienić bazę na inną? :-) W SSMS w oknie logowania jest przycisk Options. A jeśli używasz narzędzi w linii poleceń, użyj przełącznika -d.

Co o tym myślisz?

(wymagane) 
wymagane 
(wymagane) 

  
Wprowadź kod: (wymagane)

About brejk

MCT, SQL Server geek