Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

HAS_DBACCESS() – Finden Sie heraus, ob ein Benutzer auf eine Datenbank in SQL Server zugreifen kann

SQL Server hat einen HAS_DBACCESS() Funktion, die Informationen darüber zurückgibt, ob der Benutzer Zugriff auf eine bestimmte Datenbank hat.

Syntax

Die Syntax lautet wie folgt:

HAS_DBACCESS ( 'database_name' )

Die Funktion gibt 1 zurück wenn der Benutzer Zugriff auf die Datenbank hat, 0 wenn der Benutzer keinen Zugriff auf die Datenbank hat, und NULL wenn der Datenbankname nicht gültig ist.

Es gibt 0 zurück wenn die Datenbank offline oder verdächtig ist, und gibt 0 zurück wenn sich die Datenbank im Einzelbenutzermodus befindet und die Datenbank von einem anderen Benutzer verwendet wird.

Beispiel

Hier ist ein Beispiel zur Veranschaulichung:

SELECT HAS_DBACCESS('KrankyKranes');

Ergebnis:

1

In diesem Fall 1 zurückgegeben, was bedeutet, dass der Benutzer Zugriff auf KrankyKranes hat Datenbank.

Nicht vorhandene Datenbank

Wenn die Datenbank nicht existiert, ist das Ergebnis NULL :

SELECT HAS_DBACCESS('Oops');

Ergebnis:

NULL

Alle Datenbanken prüfen

Wir können die folgende Abfrage verwenden, um den Zugriff auf alle Datenbanken in der SQL Server-Instanz zu überprüfen:

SELECT 
    name AS DB,
    HAS_DBACCESS(name) AS HasDBAccess
FROM sys.databases;

Ergebnis:

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

In diesem Fall hatte ich Zugriff auf alle Datenbanken.

Folgendes passiert, wenn ich die Abfrage als Benutzer mit Zugriff auf weniger Datenbanken ausführe:

SELECT 
    name AS DB,
    HAS_DBACCESS(name) AS HasDBAccess
FROM sys.databases;

Ergebnis:

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