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

Retornar privilégios de coluna de um servidor vinculado no SQL Server (exemplos de T-SQL)


No SQL Server você pode usar o sp_column_privileges_ex procedimento armazenado do sistema para retornar privilégios de coluna para as colunas de um servidor vinculado especificado.

Você pode especificar uma coluna individual ou pode especificar todas as colunas de um determinado banco de dados, tabela etc.


Sintaxe


A sintaxe fica assim:
sp_column_privileges_ex [ @table_server = ] 'table_server'   
     [ , [ @table_name = ] 'table_name' ]   
     [ , [ @table_schema = ] 'table_schema' ]   
     [ , [ @table_catalog = ] 'table_catalog' ]   
     [ , [ @column_name = ] 'column_name' ]

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 eu os abordo nos exemplos a seguir. Para obter mais informações sobre esses argumentos, consulte a documentação da Microsoft.

Exemplo 1 - Devolução de privilégios para uma coluna específica


O exemplo a seguir 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_column_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'City', 
  @table_schema = 'Dimension',   
  @table_catalog = 'WideWorldImportersDW',   
  @column_name = 'Region';

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

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

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

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

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

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

Exemplo 3 – Especificar apenas uma tabela


Neste exemplo, especifico apenas o nome da tabela.
EXEC sp_column_privileges_ex 
  @table_server = 'Homer',
  @table_name = 'Artists';

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

Isso retorna os privilégios para todas as colunas na tabela especificada.

Exemplo 4 – Especificar apenas o nome da coluna


Neste exemplo eu especifico apenas o nome da coluna (também o servidor, obviamente).
EXEC sp_column_privileges_ex 
  @table_server = 'Homer',   
  @column_name = 'ArtistName';

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

Isso retornou privilégios para mais três colunas. Estes são de três visualizações diferentes (o banco de dados tem três visualizações com um ArtistName coluna:BluesAlbums , JazzAlbums e RockAlbums ).

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

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

Exemplo 6 – Especificar um esquema de tabela


O exemplo a seguir restringe os resultados a um esquema de tabela específico (dbo ).
EXEC sp_column_privileges_ex 
  @table_server = 'Homer',  
  @table_schema = 'dbo';

Isso retornou um conjunto de resultados muito menor do que o exemplo anterior. Ainda é muito grande, então não vou exibi-lo aqui.

Exemplo 7 – Caracteres curinga


Você também pode usar caracteres curinga. Aqui está um exemplo de uso do % caractere curinga:
EXEC sp_column_privileges_ex 
  @table_server = 'Homer',  
  @table_schema = 'dbo',
  @table_catalog = 'Music',   
  @column_name = 'Ar%';

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