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
.