SQL Server har en HAS_DBACCESS()
funktion som returnerar information om huruvida användaren har tillgång till en specificerad databas.
Syntax
Syntaxen ser ut så här:
HAS_DBACCESS ( 'database_name' )
Funktionen returnerar 1
om användaren har tillgång till databasen, 0
om användaren inte har tillgång till databasen, och NULL
om databasnamnet inte är giltigt.
Den returnerar 0
om databasen är offline eller misstänkt, och den returnerar 0
om databasen är i enanvändarläge och databasen används av en annan användare.
Exempel
Här är ett exempel att visa:
SELECT HAS_DBACCESS('KrankyKranes');
Resultat:
1
I det här fallet, 1
returnerades, vilket innebär att användaren har tillgång till KrankyKranes
databas.
Icke existerande databas
Om databasen inte finns är resultatet NULL
:
SELECT HAS_DBACCESS('Oops');
Resultat:
NULL
Kontrollera alla databaser
Vi kan använda följande fråga för att kontrollera åtkomst till alla databaser i SQL Server-instansen:
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å fall hade jag tillgång till alla databaser.
Det här är vad som händer när jag kör frågan som en användare med tillgång till 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 | +-----------------------+---------------+