Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Restituisci i privilegi della tabella da un server collegato in SQL Server (esempi T-SQL)

In SQL Server puoi usare sp_table_privileges_ex stored procedure di sistema per restituire le informazioni sui privilegi su una tabella specificata da un server collegato specificato.

È possibile specificare una singola tabella oppure specificare tutte le tabelle da un determinato database o schema di tabelle. È inoltre possibile utilizzare i caratteri jolly per specificare la/le tabella/e. Tuttavia, puoi anche specificare se i caratteri jolly devono essere interpretati come caratteri jolly.

Sintassi

La sintassi è questa:

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

Il @table_server argomento è l'unico argomento richiesto. Questo è il nome del server collegato da cui vuoi le informazioni sulla tabella.

Gli altri argomenti sono facoltativi e sono illustrati nei seguenti esempi.

Esempio 1:privilegi di restituzione per una tabella specifica

Questo esempio restituisce i privilegi per una colonna specifica, in una tabella specifica, da uno schema di tabella specifico, in un database specifico.

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

Risultato:

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

Questo potrebbe anche essere eseguito in questo modo:

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

Esempio 2:utilizzo del database predefinito

Se non fornisci il @table_catalog argomento (per specificare il database), verrà utilizzato il database predefinito per il server collegato.

Se rimuovo il @table_catalog argomento dell'esempio precedente:

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

Ottengo il seguente risultato:

(0 rows affected)
Time: 0.311s

Questo perché WideWorldImportersDW database non è il database predefinito per il server collegato. In questo caso, quando ho creato il server collegato, ho utilizzato @catalog = 'Music' per specificare che il database chiamato Music sarebbe il database predefinito per questo server collegato.

Quindi, se specifico una colonna che si trova nel database predefinito, otterrò risultati:

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

Ottengo il seguente risultato:

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

Si noti che non ho specificato lo schema della tabella in questo esempio, poiché è facoltativo.

Esempio 3:specificare solo il nome dello schema della tabella

In questo esempio specifico solo il nome dello schema (anche il server, ovviamente).

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

Ciò restituisce 35 righe sul mio sistema. Questo copre 4 tabelle e 3 viste.

Esempio 4:specificare solo il server collegato (nessun altro argomento)

Qui specifico solo il server collegato – non fornisco altri argomenti. In questo caso, restituirà tutti i privilegi per tutte le colonne del database:

EXEC sp_table_privileges_ex 
  @table_server = 'Homer';

Non visualizzerò i risultati qui perché ha restituito oltre 3.000 righe. La maggior parte di questi proveniva da sys schema della tabella.

Esempio 5 – Caratteri jolly

Puoi anche usare caratteri jolly. Ecco un esempio di utilizzo del % carattere jolly:

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

Risultato:

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

Questo restituisce i privilegi per tutte le tabelle che iniziano con Ar .

Tuttavia, puoi anche usare @fUsePattern argomento per determinare se i caratteri jolly devono essere interpretati o meno come caratteri jolly. Il valore predefinito è 1 , il che significa che devono essere interpretati come caratteri jolly. Un valore di 0 specifica che non devono essere interpretati come caratteri jolly.

Ecco cosa succede se aggiungo @fUsePattern = 0 all'esempio precedente:

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

Risultato:

(0 rows affected)
Time: 0.318s

Ed ecco cosa succede se lo imposto su 1 :

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

Risultato:

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