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

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

Dans SQL Server, vous pouvez utiliser le sp_column_privileges_ex procédure stockée système pour renvoyer les privilèges de colonne pour les colonnes à partir d'un serveur lié spécifié.

Vous pouvez spécifier une colonne individuelle ou vous pouvez spécifier toutes les colonnes d'une base de données, d'une table, etc.

Syntaxe

La syntaxe ressemble à ceci :

sp_column_privileges_ex [ @table_server = ] 'table_server'   
     [ , [ @table_name = ] 'table_name' ]   
     [ , [ @table_schema = ] 'table_schema' ]   
     [ , [ @table_catalog = ] 'table_catalog' ]   
     [ , [ @column_name = ] 'column_name' ]

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 je les couvre dans les exemples suivants. Pour plus d'informations sur ces arguments, consultez la documentation de Microsoft.

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

L'exemple suivant 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_column_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'City', 
  @table_schema = 'Dimension',   
  @table_catalog = 'WideWorldImportersDW',   
  @column_name = 'Region';

Résultat :

+----------------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+
| TABLE_CAT            | TABLE_SCHEM   | TABLE_NAME   | COLUMN_NAME   | GRANTOR   | GRANTEE   | PRIVILEGE   | IS_GRANTABLE   |
|----------------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------|
| WideWorldImportersDW | Dimension     | City         | Region        | dbo       | dbo       | INSERT      | YES            |
| WideWorldImportersDW | Dimension     | City         | Region        | dbo       | dbo       | REFERENCES  | YES            |
| WideWorldImportersDW | Dimension     | City         | Region        | dbo       | dbo       | SELECT      | YES            |
| WideWorldImportersDW | Dimension     | City         | Region        | dbo       | dbo       | UPDATE      | YES            |
+----------------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+

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

EXEC sp_column_privileges_ex 
  'Homer',
  'City', 
  'Dimension',   
  'WideWorldImportersDW',   
  'Region';

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_column_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'City', 
  @table_schema = 'Dimension',
  @column_name = 'Region';

J'obtiens le résultat suivant :

(0 rows affected)
Time: 0.321s

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_column_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'Artists', 
  @table_schema = 'dbo',
  @column_name = 'ArtistId';

J'obtiens le résultat suivant :

+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+
| TABLE_CAT   | TABLE_SCHEM   | TABLE_NAME   | COLUMN_NAME   | GRANTOR   | GRANTEE   | PRIVILEGE   | IS_GRANTABLE   |
|-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------|
| Music       | dbo           | Artists      | ArtistId      | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | Artists      | ArtistId      | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | Artists      | ArtistId      | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | Artists      | ArtistId      | dbo       | dbo       | UPDATE      | YES            |
+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+

Exemple 3 - Spécifier une table uniquement

Dans cet exemple, je spécifie uniquement le nom de la table.

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

Résultat :

+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+
| TABLE_CAT   | TABLE_SCHEM   | TABLE_NAME   | COLUMN_NAME   | GRANTOR   | GRANTEE   | PRIVILEGE   | IS_GRANTABLE   |
|-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------|
| Music       | dbo           | Artists      | ActiveFrom    | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | Artists      | ActiveFrom    | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | Artists      | ActiveFrom    | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | Artists      | ActiveFrom    | dbo       | dbo       | UPDATE      | YES            |
| Music       | dbo           | Artists      | ArtistId      | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | Artists      | ArtistId      | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | Artists      | ArtistId      | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | Artists      | ArtistId      | dbo       | dbo       | UPDATE      | YES            |
| Music       | dbo           | Artists      | ArtistName    | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | Artists      | ArtistName    | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | Artists      | ArtistName    | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | Artists      | ArtistName    | dbo       | dbo       | UPDATE      | YES            |
| Music       | dbo           | Artists      | CountryId     | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | Artists      | CountryId     | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | Artists      | CountryId     | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | Artists      | CountryId     | dbo       | dbo       | UPDATE      | YES            |
+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+

Cela renvoie les privilèges pour toutes les colonnes de la table spécifiée.

Exemple 4 - Spécifiez le nom de la colonne uniquement

Dans cet exemple, je spécifie uniquement le nom de la colonne (également le serveur, évidemment).

EXEC sp_column_privileges_ex 
  @table_server = 'Homer',   
  @column_name = 'ArtistName';

Résultats :

+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+
| TABLE_CAT   | TABLE_SCHEM   | TABLE_NAME   | COLUMN_NAME   | GRANTOR   | GRANTEE   | PRIVILEGE   | IS_GRANTABLE   |
|-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------|
| Music       | dbo           | Artists      | ArtistName    | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | Artists      | ArtistName    | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | Artists      | ArtistName    | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | Artists      | ArtistName    | dbo       | dbo       | UPDATE      | YES            |
| Music       | dbo           | BluesAlbums  | ArtistName    | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | BluesAlbums  | ArtistName    | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | BluesAlbums  | ArtistName    | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | BluesAlbums  | ArtistName    | dbo       | dbo       | UPDATE      | YES            |
| Music       | dbo           | JazzAlbums   | ArtistName    | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | JazzAlbums   | ArtistName    | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | JazzAlbums   | ArtistName    | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | JazzAlbums   | ArtistName    | dbo       | dbo       | UPDATE      | YES            |
| Music       | dbo           | RockAlbums   | ArtistName    | dbo       | dbo       | INSERT      | YES            |
| Music       | dbo           | RockAlbums   | ArtistName    | dbo       | dbo       | REFERENCES  | YES            |
| Music       | dbo           | RockAlbums   | ArtistName    | dbo       | dbo       | SELECT      | YES            |
| Music       | dbo           | RockAlbums   | ArtistName    | dbo       | dbo       | UPDATE      | YES            |
+-------------+---------------+--------------+---------------+-----------+-----------+-------------+----------------+

Cela a renvoyé des privilèges pour trois autres colonnes. Celles-ci proviennent de trois vues différentes (la base de données a trois vues avec un ArtistName colonne :BluesAlbums , JazzAlbums , et RockAlbums ).

Exemple 5 - 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_column_privileges_ex 
  @table_server = 'Homer';

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

Exemple 6 - Spécifier un schéma de table

L'exemple suivant restreint les résultats à un schéma de table spécifique (dbo ).

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

Cela a renvoyé un ensemble de résultats beaucoup plus petit que l'exemple précédent. Il est encore assez grand, donc je ne l'afficherai pas ici.

Exemple 7 – 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_column_privileges_ex 
  @table_server = 'Homer',  
  @table_schema = 'dbo',
  @table_catalog = 'Music',   
  @column_name = 'Ar%';

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