In SQL Server können Sie den sp_table_privileges_ex
verwenden gespeicherte Systemprozedur, um Berechtigungsinformationen über eine angegebene Tabelle von einem angegebenen Verbindungsserver zurückzugeben.
Sie können eine einzelne Tabelle oder alle Tabellen aus einer bestimmten Datenbank oder einem Tabellenschema angeben. Sie können auch Platzhalterzeichen verwenden, um die Tabelle/n anzugeben. Sie können aber auch angeben, ob die Wildcard-Zeichen als Wildcard-Zeichen interpretiert werden sollen.
Syntax
Die Syntax sieht so aus:
sp_table_privileges_ex [ @table_server = ] 'table_server' [ , [ @table_name = ] 'table_name' ] [ , [ @table_schema = ] 'table_schema' ] [ , [ @table_catalog = ] 'table_catalog' ] [ , [@fUsePattern =] 'fUsePattern']
Der @table_server
Argument ist das einzige erforderliche Argument. Dies ist der Name des Verbindungsservers, von dem Sie die Tabelleninformationen erhalten möchten.
Die anderen Argumente sind optional und werden in den folgenden Beispielen demonstriert.
Beispiel 1 – Berechtigungen für eine bestimmte Tabelle zurückgeben
Dieses Beispiel gibt Berechtigungen für eine bestimmte Spalte in einer bestimmten Tabelle aus einem bestimmten Tabellenschema in einer bestimmten Datenbank zurück.
EXEC sp_table_privileges_ex @table_server = 'Homer', @table_name = 'City', @table_schema = 'Dimension', @table_catalog = 'WideWorldImportersDW';
Ergebnis:
+----------------------+---------------+--------------+-----------+-----------+-------------+----------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | GRANTOR | GRANTEE | PRIVILEGE | IS_GRANTABLE | |----------------------+---------------+--------------+-----------+-----------+-------------+----------------| | WideWorldImportersDW | Dimension | City | dbo | dbo | DELETE | YES | | WideWorldImportersDW | Dimension | City | dbo | dbo | INSERT | YES | | WideWorldImportersDW | Dimension | City | dbo | dbo | REFERENCES | YES | | WideWorldImportersDW | Dimension | City | dbo | dbo | SELECT | YES | | WideWorldImportersDW | Dimension | City | dbo | dbo | UPDATE | YES | +----------------------+---------------+--------------+-----------+-----------+-------------+----------------+
Dies könnte auch so ausgeführt werden:
EXEC sp_table_privileges_ex 'Homer', 'City', 'Dimension', 'WideWorldImportersDW';
Beispiel 2 – Verwendung der Standarddatenbank
Wenn Sie @table_catalog
nicht angeben Argument (um die Datenbank anzugeben), wird die Standarddatenbank für den Verbindungsserver verwendet.
Wenn ich den @table_catalog
entferne Argument aus dem vorherigen Beispiel:
EXEC sp_table_privileges_ex @table_server = 'Homer', @table_name = 'City', @table_schema = 'Dimension';
Ich erhalte folgendes Ergebnis:
(0 rows affected) Time: 0.311s
Das liegt daran, dass WideWorldImportersDW
Datenbank ist nicht die Standarddatenbank für den Verbindungsserver. In diesem Fall habe ich beim Erstellen des Verbindungsservers @catalog = 'Music'
verwendet um anzugeben, dass die Datenbank mit dem Namen Musik die Standarddatenbank für diesen verknüpften Server sein soll.
Wenn ich also eine Spalte angebe, die sich zufällig in der Standarddatenbank befindet, erhalte ich Ergebnisse:
EXEC sp_table_privileges_ex @table_server = 'Homer', @table_name = 'Artists';
Ich erhalte folgendes Ergebnis:
+-------------+---------------+--------------+-----------+-----------+-------------+----------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | GRANTOR | GRANTEE | PRIVILEGE | IS_GRANTABLE | |-------------+---------------+--------------+-----------+-----------+-------------+----------------| | Music | dbo | Artists | dbo | dbo | DELETE | YES | | Music | dbo | Artists | dbo | dbo | INSERT | YES | | Music | dbo | Artists | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | dbo | dbo | SELECT | YES | | Music | dbo | Artists | dbo | dbo | UPDATE | YES | +-------------+---------------+--------------+-----------+-----------+-------------+----------------+
Beachten Sie, dass ich das Tabellenschema in diesem Beispiel nicht angegeben habe, da es optional ist.
Beispiel 3 – Geben Sie nur den Namen des Tabellenschemas an
In diesem Beispiel gebe ich nur den Schemanamen an (natürlich auch den Server).
EXEC sp_table_privileges_ex @table_server = 'Homer', @table_schema = 'dbo';
Das gibt 35 Zeilen auf meinem System zurück. Dies umfasst 4 Tabellen und 3 Ansichten.
Beispiel 4 – Geben Sie nur den Verbindungsserver an (keine anderen Argumente)
Hier gebe ich nur den Linked Server an – ich gebe keine weiteren Argumente an. In diesem Fall werden alle Berechtigungen für alle Spalten in der Datenbank zurückgegeben:
EXEC sp_table_privileges_ex @table_server = 'Homer';
Ich werde die Ergebnisse hier nicht anzeigen, da über 3.000 Zeilen zurückgegeben wurden. Die meisten davon stammten von sys
Tabellenschema.
Beispiel 5 – Platzhalterzeichen
Sie können auch Platzhalterzeichen verwenden. Hier ist ein Beispiel für die Verwendung von %
Platzhalterzeichen:
EXEC sp_table_privileges_ex @table_server = 'Homer', @table_name = 'Ar%';
Ergebnis:
+-------------+---------------+--------------+-----------+-----------+-------------+----------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | GRANTOR | GRANTEE | PRIVILEGE | IS_GRANTABLE | |-------------+---------------+--------------+-----------+-----------+-------------+----------------| | Music | dbo | Artists | dbo | dbo | DELETE | YES | | Music | dbo | Artists | dbo | dbo | INSERT | YES | | Music | dbo | Artists | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | dbo | dbo | SELECT | YES | | Music | dbo | Artists | dbo | dbo | UPDATE | YES | +-------------+---------------+--------------+-----------+-----------+-------------+----------------+
Dies gibt Privilegien für alle Tabellen zurück, die mit Ar
beginnen .
Sie können aber auch das @fUsePattern
verwenden Argument, um zu bestimmen, ob Platzhalterzeichen als Platzhalterzeichen interpretiert werden sollen oder nicht. Der Standardwert ist 1
, was bedeutet, dass sie als Platzhalterzeichen interpretiert werden sollten. Ein Wert von 0
gibt an, dass sie nicht als Platzhalterzeichen interpretiert werden sollen.
Folgendes passiert, wenn ich @fUsePattern = 0
hinzufüge zum vorherigen Beispiel:
EXEC sp_table_privileges_ex @table_server = 'Homer', @table_name = 'Ar%', @fUsePattern = 0;
Ergebnis:
(0 rows affected) Time: 0.318s
Und hier ist, was passiert, wenn ich es auf 1
setze :
EXEC sp_table_privileges_ex @table_server = 'Homer', @table_name = 'Ar%', @fUsePattern = 1;
Ergebnis:
+-------------+---------------+--------------+-----------+-----------+-------------+----------------+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | GRANTOR | GRANTEE | PRIVILEGE | IS_GRANTABLE | |-------------+---------------+--------------+-----------+-----------+-------------+----------------| | Music | dbo | Artists | dbo | dbo | DELETE | YES | | Music | dbo | Artists | dbo | dbo | INSERT | YES | | Music | dbo | Artists | dbo | dbo | REFERENCES | YES | | Music | dbo | Artists | dbo | dbo | SELECT | YES | | Music | dbo | Artists | dbo | dbo | UPDATE | YES | +-------------+---------------+--------------+-----------+-----------+-------------+----------------+