Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Privilégios de Tabela de Retorno de um Servidor Vinculado no SQL Server (Exemplos de T-SQL)


No SQL Server você pode usar o sp_table_privileges_ex procedimento armazenado do sistema para retornar informações de privilégio sobre uma tabela especificada de um servidor vinculado especificado.

Você pode especificar uma tabela individual ou pode especificar todas as tabelas de um determinado banco de dados ou esquema de tabela. Você também pode usar caracteres curinga para especificar a(s) tabela(s). No entanto, você também pode especificar se os caracteres curinga devem ser interpretados como caracteres curinga.


Sintaxe


A sintaxe fica assim:
sp_table_privileges_ex [ @table_server = ] 'table_server'   
     [ , [ @table_name = ] 'table_name' ]   
     [ , [ @table_schema = ] 'table_schema' ]   
     [ , [ @table_catalog = ] 'table_catalog' ]  
     [ , [@fUsePattern =] 'fUsePattern']

O @table_server argumento é o único argumento necessário. Este é o nome do servidor vinculado do qual você deseja obter as informações da tabela.

Os outros argumentos são opcionais e são demonstrados nos exemplos a seguir.

Exemplo 1 – Devolução de privilégios para uma mesa específica


Este exemplo retorna privilégios para uma coluna específica, em uma tabela específica, de um esquema de tabela específico, em um banco de dados específico.
EXEC sp_table_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'City', 
  @table_schema = 'Dimension', 
  @table_catalog = 'WideWorldImportersDW';

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

Isso também poderia ser executado assim:
EXEC sp_table_privileges_ex 
  'Homer',
  'City',
  'Dimension',
  'WideWorldImportersDW';

Exemplo 2 – Usando o banco de dados padrão


Se você não fornecer o @table_catalog argumento (para especificar o banco de dados), o banco de dados padrão para o servidor vinculado será usado.

Se eu remover o @table_catalog argumento do exemplo anterior:
EXEC sp_table_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'City', 
  @table_schema = 'Dimension';

Obtenho o seguinte resultado:
(0 rows affected)
Time: 0.311s

Isso ocorre porque o WideWorldImportersDW database não é o banco de dados padrão para o servidor vinculado. Nesse caso, quando criei o servidor vinculado, usei @catalog = 'Music' para especificar que o banco de dados chamado Música seria o banco de dados padrão para este servidor vinculado.

Então, se eu especificar uma coluna que está no banco de dados padrão, obterei resultados:
EXEC sp_table_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'Artists';

Obtenho o seguinte resultado:
+-------------+---------------+--------------+-----------+-----------+-------------+----------------+
| 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            |
+-------------+---------------+--------------+-----------+-----------+-------------+----------------+

Observe que não especifiquei o esquema da tabela neste exemplo, pois é opcional.

Exemplo 3 – Especificar apenas o nome do esquema de tabela


Neste exemplo, especifico apenas o nome do esquema (também o servidor, obviamente).
EXEC sp_table_privileges_ex 
  @table_server = 'Homer',
  @table_schema = 'dbo';

Isso retorna 35 linhas no meu sistema. Isso abrange 4 tabelas e 3 visualizações.

Exemplo 4 – Especificar apenas o servidor vinculado (sem outros argumentos)


Aqui eu especifico apenas o servidor vinculado – não forneço nenhum outro argumento. Nesse caso, retornará todos os privilégios de todas as colunas do banco de dados:
EXEC sp_table_privileges_ex 
  @table_server = 'Homer';

Não exibirei os resultados aqui porque ele retornou mais de 3.000 linhas. A maioria deles era do sys esquema da tabela.

Exemplo 5 – Caracteres curinga


Você também pode usar caracteres curinga. Aqui está um exemplo de uso do % caractere curinga:
EXEC sp_table_privileges_ex 
  @table_server = 'Homer',    
  @table_name = 'Ar%';

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

Isso retorna privilégios para todas as tabelas que começam com Ar .

No entanto, você também pode usar o @fUsePattern argumento para determinar se os caracteres curinga devem ou não ser interpretados como caracteres curinga. O valor padrão é 1 , o que significa que eles devem ser interpretados como caracteres curinga. Um valor de 0 especifica que eles não devem ser interpretados como caracteres curinga.

Aqui está o que acontece se eu adicionar @fUsePattern = 0 para o exemplo anterior:
EXEC sp_table_privileges_ex 
  @table_server = 'Homer',    
  @table_name = 'Ar%',
  @fUsePattern = 0;

Resultado:
(0 rows affected)
Time: 0.318s

E aqui está o que acontece se eu definir como 1 :
EXEC sp_table_privileges_ex 
  @table_server = 'Homer',    
  @table_name = 'Ar%',
  @fUsePattern = 1;

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