Spis treści:

Kategoria:SQL Server


Jak pobrać nazwę domyślnego schematu użytkownika w SQL Server

Schemat, przestrzeń, a użytkownik

Schemat (z ang. schema) to pewien kontener na inne obiekty bazodanowe, coś na wzór pojedynczej przestrzeni nazw. Osobiście nie lubię określenia schemat, bo jest to pojęcie łatwo mylone z podobnym pojęciem schematu bazy danych, czyli strukturą tabel i ich wzajemnym powiązaniu. Wolę określenie przestrzeń. Schemat lub przestrzeń to coś więcej niż przestrzeń nazw w rozumieniu .NET, bo każdy taki kontener może być powiązany z konkretnymi zabezpieczeniami. Nie przeszkadza to jednak w tym, aby taką przestrzeń traktować tylko jako zwykłą część nazwy. Schematy zmieniły się znacząco w SQL Server 2005. O ile w dawnych wersjach SQL Servera były one silnie powiązane z użytkownikiem, o tyle teraz są samodzielnymi tworami i mogą istnieć niezależnie. Schemat może być połączony z użytkonikiem i wpływać na wykonywane przez niego operacje lub uniemożliwiać użytkownikowi wykonywanie pewnych operacji. Jeżeli użytkownik posiada schemat, to prawa schematu przechodzą na użytkownika. Co więcej, jedna przestrzeń może być wykorzystywana przez wielu użytkowników, a w związku z przechodniością także jej prawa. Konsekwencja relacji użytkownik schema jest jeszcze taka, że można bez problemu usunąć użytkownika nie ruszając przestrzeni.

Jak pobrać informacje o domyślnym schemacie użytkownika

Sposobów jest kilka. Jeden z nich jest następujący:

DECLARE @user nvarchar(32) = USER
EXEC sp_helpuser @user

Wynikiem działania powyższego kodu będzie następujący rezultat:

UserNameRoleNameLoginNameDefDBNameDefSchemaNameUserIDSID
dbodb_ownerDOMENA\usermasterdbo10x01050...

W tym przypadku użytkownikiem jest dbo, a domyślną przestrzenią dla niego także dbo. Akurat tutaj wartości się pokrywają, ale wcale tak nie musi być.

Jest jeszcze inna metoda dobrania się do informacji o przestrzeni użytkownika i polega na odpytaniu widoku systemowego sys.database_principals. Skrypt pobierający taką informację może mieć następującą postać:

SELECT default_schema_name FROM sys.database_principals WHERE name=USER

Tym razem wynikiem całej operacji będzie pojedyncza wartość oznaczająca domyślną nazwę przestrzeni.

Być może są prostsze metody. Zachęcam do dzielenia się spostrzeżeniami w komentarzach.

Kategoria:SQL Server

, 2013-12-20

Brak komentarzy - bądź pierwszy

Dodaj komentarz
Wyślij
Ostatnie komentarze
Dzieki za rozjasnienie zagadnienia upsert. wlasnie sie ucze programowania :).
Co się stanie gdy spróbuję wyszukać:
SELECT * FROM NV_Airport WHERE Code='SVO'
SELECT * FROM V_Airport WHERE Code=N'SVO'
(odwrotnie są te N-ki)
Będzie konwersja czy nie znajdzie żadnego rekordu?