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