Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Renvoyer les privilèges de table à partir d'un serveur lié dans SQL Server (exemples T-SQL)

Dans SQL Server, vous pouvez utiliser le sp_table_privileges_ex procédure stockée système pour renvoyer des informations de privilège sur une table spécifiée à partir d'un serveur lié spécifié.

Vous pouvez spécifier une table individuelle ou vous pouvez spécifier toutes les tables d'une base de données ou d'un schéma de table donné. Vous pouvez également utiliser des caractères génériques pour spécifier la ou les tables. Cependant, vous pouvez également spécifier si les caractères génériques doivent être interprétés comme des caractères génériques.

Syntaxe

La syntaxe ressemble à ceci :

sp_table_privileges_ex [ @table_server = ] 'table_server'   
     [ , [ @table_name = ] 'table_name' ]   
     [ , [ @table_schema = ] 'table_schema' ]   
     [ , [ @table_catalog = ] 'table_catalog' ]  
     [ , [@fUsePattern =] 'fUsePattern']

Le @table_server argument est le seul argument requis. Il s'agit du nom du serveur lié à partir duquel vous souhaitez obtenir les informations de la table.

Les autres arguments sont facultatifs et sont illustrés dans les exemples suivants.

Exemple 1 – Privilèges de retour pour une table spécifique

Cet exemple renvoie des privilèges pour une colonne spécifique, dans une table spécifique, à partir d'un schéma de table spécifique, dans une base de données spécifique.

EXEC sp_table_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'City', 
  @table_schema = 'Dimension', 
  @table_catalog = 'WideWorldImportersDW';

Résultat :

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

Cela pourrait aussi être exécuté comme ceci :

EXEC sp_table_privileges_ex 
  'Homer',
  'City',
  'Dimension',
  'WideWorldImportersDW';

Exemple 2 - Utilisation de la base de données par défaut

Si vous ne fournissez pas le @table_catalog (pour spécifier la base de données), la base de données par défaut du serveur lié sera utilisée.

Si je supprime le @table_catalog argument de l'exemple précédent :

EXEC sp_table_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'City', 
  @table_schema = 'Dimension';

J'obtiens le résultat suivant :

(0 rows affected)
Time: 0.311s

C'est parce que le WideWorldImportersDW database n'est pas la base de données par défaut du serveur lié. Dans ce cas, lorsque j'ai créé le serveur lié, j'ai utilisé @catalog = 'Music' pour spécifier que la base de données appelée Musique serait la base de données par défaut pour ce serveur lié.

Donc, si je spécifie une colonne qui se trouve dans la base de données par défaut, j'obtiendrai des résultats :

EXEC sp_table_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'Artists';

J'obtiens le résultat suivant :

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

Notez que je n'ai pas spécifié le schéma de table dans cet exemple, car il est facultatif.

Exemple 3 - Spécifiez le nom du schéma de table uniquement

Dans cet exemple, je spécifie uniquement le nom du schéma (également le serveur, évidemment).

EXEC sp_table_privileges_ex 
  @table_server = 'Homer',
  @table_schema = 'dbo';

Cela renvoie 35 lignes sur mon système. Cela couvre 4 tables et 3 vues.

Exemple 4 - Spécifier uniquement le serveur lié (pas d'autres arguments)

Ici, je ne spécifie que le serveur lié - je ne fournis aucun autre argument. Dans ce cas, il renverra tous les privilèges pour toutes les colonnes de la base de données :

EXEC sp_table_privileges_ex 
  @table_server = 'Homer';

Je n'afficherai pas les résultats ici car il a renvoyé plus de 3 000 lignes. La plupart d'entre eux provenaient du sys schéma de table.

Exemple 5 – Caractères génériques

Vous pouvez également utiliser des caractères génériques. Voici un exemple d'utilisation du % caractère générique :

EXEC sp_table_privileges_ex 
  @table_server = 'Homer',    
  @table_name = 'Ar%';

Résultat :

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

Cela renvoie des privilèges pour toutes les tables qui commencent par Ar .

Cependant, vous pouvez également utiliser le @fUsePattern argument pour déterminer si les caractères génériques doivent ou non être interprétés comme des caractères génériques. La valeur par défaut est 1 , ce qui signifie qu'ils doivent être interprétés comme des caractères génériques. Une valeur de 0 spécifie qu'ils ne doivent pas être interprétés comme des caractères génériques.

Voici ce qui se passe si j'ajoute @fUsePattern = 0 à l'exemple précédent :

EXEC sp_table_privileges_ex 
  @table_server = 'Homer',    
  @table_name = 'Ar%',
  @fUsePattern = 0;

Résultat :

(0 rows affected)
Time: 0.318s

Et voici ce qui se passe si je le mets à 1 :

EXEC sp_table_privileges_ex 
  @table_server = 'Homer',    
  @table_name = 'Ar%',
  @fUsePattern = 1;

Résultat :

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