none
Permissão de Usuário - Apenas SELECT de VIEWS RRS feed

  • Pergunta

  • Bom dia,

    criei um banco de dados no SqlServer (2008 R2), com 2 SCHEMAs (dbo e cli). No SCHEMA "cli" fiz as VIEWS que quero que um usuário tenha acesso. Como exemplo:

    CREATE DATABASE mydb
    GO
    
    CREATE TABLE mydb.dbo.table_names
      (nan_id INT IDENTITY NOT NULL
         CONSTRAINT PK_table_names PRIMARY KEY (nan_id),
       nan_name NVARCHAR(255) NOT NULL
         CONSTRAINT UK_table_names UNIQUE (nan_name))
    ON primary
    GO
    
    CREATE TABLE mydb.dbo.table_orders
      (ord_id INT IDENTITY NOT NULL
         CONSTRAINT PK_table_orders PRIMARY KEY (ord_id),
       ord_name INT NOT NULL
         CONSTRAINT FK_table_orders_names
           FOREIGN KEY (ord_name)
           REFERENCES altium.dbo.table_names (nan_id)
           ON UPDATE NO ACTION
           ON DELETE CASCADE,
       ord_date DATE NOT NULL)
    ON primary
    GO
    
    USE mydb
    GO
    
    CREATE SCHEMA cli AUTHORIZATION dbo;
    GO
    
    CREATE VIEW cli.orderlist AS
      SELECT
        ord_id,
        nan_name,
        ord_date
      FROM
        mydb.dbo.table_orders
        LEFT OUTER JOIN mydb.dbo.table_names ON ord_name = nan_id
    GO

    Meu problema é criar um usuário que SÓ POSSA ACESSAR AS VIEWS CRIADAS EM "cli". Quando faço isso o SQL tem um problema pois o SELECT dentro da VIEW chama tabelas do SCHEMA "dbo" ao qual o usuário NÃO TERÁ ACESSO.

    Objetivo: Não quero que o usuário acesse tabelas (nenhuma) diretamente, apenas por VIEWS. Como faço?

    quinta-feira, 10 de setembro de 2015 13:24

Respostas

  • SammuelMiranda,

    Então, ai que mora o problema!!! A view por padrão contem a referência da estrutura das tabelas utilizadas no código da view, se o mesmo usuário não conseguir acessar a tabela, a view nãos será processada.

    Observando o seu select, vi que você esta especificando um Schema chamado cli antes do nome da view. Este mesmo schema é utilizado pelas tabelas envolvidas na view? Se for, acredito que você deverá dar permissão para este usuário ao schema cli.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta SammuelMiranda sábado, 12 de setembro de 2015 13:21
    sexta-feira, 11 de setembro de 2015 18:02
  • SammuelMiranda,

    Então, para o usuário não ter permissão de ver as tabelas, teoricamente você teria que limitar na verdade as permissões dele herdadas do login, ou seja, este tipo de permissão propriamente você não vai aplicar ao usuário e sim ao login, negando que o mesmo tenha a permissão de View Any Definitions, na Guia Securables das propriedades do Login.

    Quando se referimos ao uso do Grant, você pode dar permissão de Select e References na View, desta forma, ele conseguirá fazer o select da view e terá a capacidade de buscar as referências desta view.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta SammuelMiranda segunda-feira, 21 de setembro de 2015 20:01
    sexta-feira, 18 de setembro de 2015 18:23

Todas as Respostas

  • Samuel bom dia,

    Cara você pode tem 2 formas de fazer isso, ou você da um grant a view ou cria um role e da um grant da role na view e associa o usuário a role.

    exemplo 1:

    grant select on orderlist to [usuario];

    Exemplo 2:

    USE db_name CREATE ROLE nm_role AUTHORIZATION db_datareader; GO

    grant select on orderlist to [nm_role];

    USE db_name
    GO
    EXEC sp_addrolemember N'role_name', 'usuario'
    GO

    Espero ter ajudado


    Se a resposta foi útil por favor classifique. Tiago Neves - @tiagolneves - acesse o meu blog http://www.tiagoneves.net

    • Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 11 de setembro de 2015 17:59
    • Marcado como Resposta Marcos SJ sexta-feira, 11 de setembro de 2015 20:01
    • Não Marcado como Resposta SammuelMiranda sábado, 12 de setembro de 2015 13:22
    quinta-feira, 10 de setembro de 2015 14:29
  • Olá Sammuel,

    Basta conceder acesso direto à view, o que não implica em concessão de acesso para as tabelas que fazem parte dela. 

    GRANT SELECT ON cli.vw_NomeDaSuaViewEtcEtc to UsrQueVoceQuerConcederAcesso

    Onde cli é o schema da view. Conceder permissão na view não implica em conceder permissão nas tabelas envolvidas e o contrário também é verdadeiro.

    Recomendo para leitura adicional: CREATE VIEW

    []'s


    Se a resposta ajudou, classifique e ajude outros membros da comunidade.

    • Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 11 de setembro de 2015 17:59
    • Marcado como Resposta Marcos SJ sexta-feira, 11 de setembro de 2015 20:01
    • Não Marcado como Resposta SammuelMiranda sábado, 12 de setembro de 2015 13:22
    quinta-feira, 10 de setembro de 2015 14:33
  • Então, eu tentei isso uma vez - o comando funcionou, mas na hora de dar o SELECT * FROM mydb.cli.nomedaview ele deu um erro dizendo que o usuário não tinha acesso as colunas das tabelas envolvidas...

    quinta-feira, 10 de setembro de 2015 16:37
  • SammuelMiranda,

    Então, ai que mora o problema!!! A view por padrão contem a referência da estrutura das tabelas utilizadas no código da view, se o mesmo usuário não conseguir acessar a tabela, a view nãos será processada.

    Observando o seu select, vi que você esta especificando um Schema chamado cli antes do nome da view. Este mesmo schema é utilizado pelas tabelas envolvidas na view? Se for, acredito que você deverá dar permissão para este usuário ao schema cli.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta SammuelMiranda sábado, 12 de setembro de 2015 13:21
    sexta-feira, 11 de setembro de 2015 18:02
  • Primeiramente obrigado a todo pelas respostas.

    Algumas respostas foram marcadas pelo moderador, e apesar de serem muito boas respostas as quais agradeço o empenho e o tempo, não respondem o meu problema.

    Marquei no entanto a resposta do Junior Galvão como resposta do tópico. Sim Junior, as tabelas estão no Schema "DBO" e as views no Schema "CLI", criado por mim justamente para esta finalidade. Minha ideia é que o usuário que desejo criar tenha acesso APENAS AS VIEWS (criadas no Schema "CLI") e NÃO POSSA FAZER NADA (nem SELECT) no Schema "DBO".

    O problema é justamente que o Schema "CLI" é composto de Views que fazem pesquisas em tabelas do Schema "DBO". A ideia é justamente impedir o acesso direto a tabela, permitindo que seja feito apenas por VIEWS.

    Isso é possível?

    sábado, 12 de setembro de 2015 13:26
  • Sammuel,

    Certo, na mas verdade a view tem que ter acesso a tabela, para que ela possa conseguir obter informações da estrutura, bem como, a obtenção dos dados.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 15 de setembro de 2015 17:32
  • Sim Junior, eu já me desenganei com isso ... :)

    Qual a alternativa para um usuário ver SÓ AS VIEWS, mas não as tableas? É bem isso, o usuário não pode fazer SELECT XX FROM TABLE, esse é o objetivo, ele tem que, obrigatoriamente fazer SELECT XX FROM VIEW!

    Se der, ele não deve nem saber que a tabela existe... ai seria o que o Tiago_Neves falou?

    quarta-feira, 16 de setembro de 2015 18:22
  • SammuelMiranda,

    Então, para o usuário não ter permissão de ver as tabelas, teoricamente você teria que limitar na verdade as permissões dele herdadas do login, ou seja, este tipo de permissão propriamente você não vai aplicar ao usuário e sim ao login, negando que o mesmo tenha a permissão de View Any Definitions, na Guia Securables das propriedades do Login.

    Quando se referimos ao uso do Grant, você pode dar permissão de Select e References na View, desta forma, ele conseguirá fazer o select da view e terá a capacidade de buscar as referências desta view.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta SammuelMiranda segunda-feira, 21 de setembro de 2015 20:01
    sexta-feira, 18 de setembro de 2015 18:23
  • Vou fazer isso Junior, obrigado pela dica.

    Posso fazer no Login também, pois ambos o Usuário e o Login são criados pelo meu programa - no Login seria "View Any Definitions" em "Securables" que você disse? Vou verificar, mas é isso - esse login deverá acessar rigorosamente APENAS AS VIEWS do Schema "cli" - mesmo que essas views façam select no Schema "dbo".

    segunda-feira, 21 de setembro de 2015 20:03