SQL Server har en HAS_DBACCESS() funktion, der returnerer information om, hvorvidt brugeren har adgang til en specificeret database.
Syntaks
Syntaksen ser sådan ud:
HAS_DBACCESS ( 'database_name' )
Funktionen returnerer 1 hvis brugeren har adgang til databasen, 0 hvis brugeren ikke har adgang til databasen, og NULL hvis databasenavnet ikke er gyldigt.
Det returnerer 0 hvis databasen er offline eller mistænkelig, og den returnerer 0 hvis databasen er i enkeltbrugertilstand, og databasen er i brug af en anden bruger.
Eksempel
Her er et eksempel til demonstration:
SELECT HAS_DBACCESS('KrankyKranes'); Resultat:
1
I dette tilfælde 1 blev returneret, hvilket betyder, at brugeren har adgang til KrankyKranes database.
Ikke-eksisterende database
Hvis databasen ikke eksisterer, er resultatet NULL :
SELECT HAS_DBACCESS('Oops'); Resultat:
NULL
Tjek alle databaser
Vi kan bruge følgende forespørgsel til at kontrollere adgangen til alle databaser i SQL Server-forekomsten:
SELECT
name AS DB,
HAS_DBACCESS(name) AS HasDBAccess
FROM sys.databases; Resultat:
+-----------------------+---------------+ | DB | HasDBAccess | |-----------------------+---------------| | master | 1 | | tempdb | 1 | | model | 1 | | msdb | 1 | | Music | 1 | | KrankyKranes | 1 | | Test | 1 | | WideWorldImporters | 1 | | World | 1 | | DomainDispute | 1 | | PetHotel | 1 | | StereoSystems | 1 | | NarrowNationExporters | 1 | +-----------------------+---------------+
I så fald havde jeg adgang til alle databaser.
Her er, hvad der sker, når jeg kører forespørgslen som bruger med adgang til færre databaser:
SELECT
name AS DB,
HAS_DBACCESS(name) AS HasDBAccess
FROM sys.databases; Resultat:
+-----------------------+---------------+ | DB | HasDBAccess | |-----------------------+---------------| | master | 1 | | tempdb | 1 | | model | 0 | | msdb | 1 | | Music | 0 | | KrankyKranes | 0 | | Test | 1 | | WideWorldImporters | 0 | | World | 0 | | DomainDispute | 0 | | PetHotel | 0 | | StereoSystems | 0 | | NarrowNationExporters | 0 | +-----------------------+---------------+