Preciso limitar o acesso a um usuário específico, mas ele ainda precisa ver os dados nas tabelas pertencentes ao dbo.
Estou tentando fazer o seguinte:
- esquema dbo funciona como normalmente, tem acesso a tudo
- schema1 schema tem acesso apenas aos objetos schema1
- se uma exibição de esquema1 ou procedimento armazenado acessar dados em tabelas pertencentes ao dbo, a cadeia de permissões adequadamente
- o usuário1 tem acesso ao esquema1 e nada mais; exceto no caso de # 3
Aqui está o que eu tentei:
- Crie um usuário user1 mapeado para um logon de teste com uma senha aleatória
- Criou algumas tabelas no esquema dbo com alguns dados de teste
- Criou um esquema schema1
- Criou um schema1.get_profiles que seleciona 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 logado como usuário1:
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 começar a 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 no nível dbo):
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.
O que eu preciso é do usuário1 para poder acessar os dados através dos procedimentos armazenados que eu forneço, e nada mais.
Além disso, pretende-se, eventualmente, viver em um banco de dados existente do SQL Azure, mas estou testando primeiro um banco de dados fictício local.
fonte
Respostas:
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 o explicará em detalhes
Agora teste:
Agora crie procedimentos armazenados:
Agora conceda permissões de execução ao usuário A no SP do schemaB
Teste .. para ver se o UsuárioA é capaz de executar o SP a partir do schemaB. Isto vai passar
Mas o UsuárioA não poderá ver dados do SchemaB
Como alternativa, você pode usar o DATABASE ROLE e apenas adicionar usuários a ele para obter melhor gerenciamento de permissões:
A instrução abaixo garantirá que o UsuárioA possa ver o esquemaA e NÃO o esquemaB. O bom é que você pode 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 UsuárioA execute SPs pertencentes ao SchemaB, a instrução abaixo fará o trabalho:
Dessa forma, o Usuário A não pode ver as tabelas do SchemaB, mas ainda pode executar procs do SchemaB.
Abaixo, explicaremos a hierarquia de permissões :
fonte