Eu preciso limitar o acesso a um usuário específico, mas eles ainda precisam ver os dados nas tabelas de propriedade do dbo.
Estou tentando fazer o seguinte:
- O esquema dbo funciona normalmente, tem acesso a tudo
- schema1 schema tem acesso apenas a objetos schema1
- se uma visualização do esquema1 ou procedimento armazenado acessar dados em tabelas de propriedade do dbo, a cadeia de permissões apropriadamente
- user1 tem acesso ao schema1 e nada mais; exceto no caso de #3
Aqui está o que eu tentei:
- Crie um usuário user1 mapeado para um login de teste com uma senha aleatória
- Criou algumas tabelas no esquema dbo com alguns dados de teste nelas
- Criado um esquema schema1
- Criou um schema1.get_profiles que seleciona a partir de uma visualização chamada schema1.profiles que acessa dados em dbo.people, dbo.taglinks e dbo.tags
No entanto, usando a seguinte instrução enquanto estiver conectado como user1:
EXEC get_profiles 1
resulta em:
The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'.
Eu tentei WITH EXECUTE AS OWNER
e não consigo entender como o "encadeamento de propriedade" deve funcionar.
eu também tentei
GRANT EXECUTE ON SCHEMA::schema1 TO user1
GRANT INSERT ON SCHEMA::schema1 TO user1
GRANT SELECT ON SCHEMA::schema1 TO user1
GRANT UPDATE ON SCHEMA::schema1 TO user1
GRANT VIEW DEFINITION ON SCHEMA::schema1 TO user1
mas recebo o seguinte erro (apesar de ser um usuário com acesso de nível dbo):
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.
O que eu preciso é que o usuário1 possa acessar os dados por meio dos procedimentos armazenados que eu forneço, e nada mais.
Além disso, isso se destina a eventualmente residir em um banco de dados SQL Azure existente, mas estou testando primeiro em um banco de dados fictício local.
O conceito básico é usar permissões de esquema GRANT/DENY . Você pode gerenciar permissões com eficiência criando uma função e adicionando membros a ela.
Abaixo está um exemplo que irá explicar em detalhes
Agora teste:
Agora crie procedimentos armazenados:
Agora conceda permissões de execução para UserA no SP do schemaB
Teste-o .. para ver se o UserA é capaz de executar o SP do schemaB. Isto vai passar
Mas o UserA não poderá ver os dados do SchemaB
Alternativamente, você pode usar DATABASE ROLE e apenas adicionar usuários a ele para melhor gerenciamento de permissões:
A instrução abaixo garantirá que o UserA possa ver o esquemaA e NÃO o esquemaB. O bom é que você pode simplesmente adicionar usuários à
SchemaBUsesSchemaAProc
função e eles herdarão todas as permissões concedidas a essa função.Se você deseja apenas permitir que o UserA execute SPs pertencentes ao SchemaB, a instrução abaixo fará o trabalho:
Desta forma, UserA não consegue ver as tabelas do SchemaB, mas ainda pode executar procs do SchemaB.
Abaixo irá explicar a hierarquia de permissões :