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 | +-----------------------+---------------+