SóProvas


ID
599692
Banca
CESGRANRIO
Órgão
Petrobras
Ano
2011
Provas
Disciplina
Banco de Dados
Assuntos

Sobre visões em bancos de dados relacionais, considere as afirmativas a seguir.

I - O uso de visões permite restringir o acesso a dados das tabelas por razões de segurança.

II - Fazer insert em uma visão gerada a partir de uma única tabela, e que não contenha a chave primária da tabela nessa visão, gera erro.

III - É impossível fazer update em visões geradas por junções em mais de uma tabela.

Está correto APENAS o que se afirma em

Alternativas
Comentários
  • Gabarito alterado para letra A

    questão II: é possível dentro de um sgbd/contexto específico e como esse contexto não foi inserido no comando da questão, o que deveria ser levado em consideração é a regra geral, e nela não é possível atualizar uma visão sem informar a chave primária, ou não respeitando quaisquer restrições existentes.

    questão III: é dito pelo Navathe que em regra não há possibilidade de se atualizar uma visão de duas tabelas, no entanto, se essas tabelas são idênticas, como por exemplo, autorelacionamento, uma visão poderia ser atualizada.

    fonte: http://br.groups.yahoo.com/group/timasters/message/131812
  • Auciomar,
    Ate concordo q o gabarito seja alterado pra A, pq acho q apenas I esteja correta, porem, nao foi o caso. Conforme se pode consultar o gabarito oficial divulgado em http://www1.cesgranrio.org.br/pdf/petrobras0111/petrobras0111_gabarito_superior.pdf, a alternativa correta eh a letra "D".

    Vamos 'a definiçao de visoes segundo alguns autores:
    NAVATHE afirma q 1 view eh 1 unica tabela q eh derivada de outras tabelas (sendo considerada 1 tabela virtual), o q limita as possiveis operacoes de atualizaçaõ q podem ser aplicadas as views.
    Uma view tbm tem a vantagem de "esconder" consultas complexas, q se usa com frequencia. Por ex, em 1 join, em vez de ter q especificar a junçaõ de várias tabelas para fazer determinada consulta, pdemos definir 1 view q eh especificada como resultado dessas juncoes. Depois, pdemos emitir consultas sobre a view, q são especificadas cmo leitura de 1 unica tabela, em vez de leituras envolvendo junçoes de varias tabelas.
    1 view com 1 unica tabela de definicao eh atualizavel se seus atributos tiverem a chave primaria da relacao base, bem como todos os atributos com a restricao not null q n tem valor default especificado. Essa definiçao de Navathe torna a alternativa II errada.
    Silberchatz acrescenta q as views definidas sobre multiplas tabelas usando joins "geralmente" nao sao atualizaveis(O q torna a alternativa III errada). Porem, uma view pde ser atualizavel se todas as condicoes a seguir forem verdadeiras:
    - a clausula from possui apenas 1 relacao de BD;
    - a clausula select contem apenas nomes de atributo da relacao e nao possui quaisquer expressoes, agregadas ou especificação distinct
    - qqr atributo nao listado na clausula select pde ser definido em nulo;
    - a consulta nao possui uma clausula group by ou having
    Silberchatz ainda justifica q as views impedem q usuarios vejam o modulo logico inteiro do BD. Consideraçoes de segurança pdem exigir q certos dados sejam ocultos(o q justifica a questao I). Por ex, qdo vc vai sacar algum valor no caixa, o caixa do seu banco não precisa ver seu saldo, mas apenas se vc possui fundos pra sacar determinado valor. Ja o gerente do seu
    banco pode ter acesso a seu saldo(assim como vc).
    Assim, considero como correta apenas a "I". Porem, repito, o gabarito oficial não foi alterado, e, segundo ele, a II(nao sei com q justificativa) tbm esta correta.

  • A (II) está correta, por exemplo, no caso abaixo, em que a chave primária é gerenciada pelo SGBD:

    mysql> CREATE TABLE animals (
        ->      id MEDIUMINT NOT NULL AUTO_INCREMENT,
        ->      name CHAR(30) NOT NULL,
        ->      PRIMARY KEY (id)
        -> );
    Query OK, 0 rows affected (0.01 sec)
     
    mysql> INSERT INTO animals (name) VALUES
        ->     ('dog'),('cat'),('penguin'),
        ->     ('lax'),('whale'),('ostrich');
    Query OK, 6 rows affected (0.00 sec)
    Records: 6  Duplicates: 0  Warnings: 0
     
    mysql> CREATE VIEW mamales AS SELECT * FROM animals WHERE name IN ('dog','cat','whale');
    Query OK, 0 rows affected (0.02 sec)
     
    mysql> INSERT INTO mamales (name) VALUES ('shark'); 
    Query OK, 1 row affected (0.01 sec)

    mysql> SELECT * FROM animals;
    +----+---------+
    | id | name    |
    +----+---------+
    |  1 | dog     |
    |  2 | cat     |
    |  3 | penguin |
    |  4 | lax     |
    |  5 | whale   |
    |  6 | ostrich |
    |  7 | shark    |
    +----+---------+
    7 rows in set (0.00 sec)

    (III) Uma visão com múltiplas tabelas pode ser atualizável caso:
    * o campo a ser atualizado seja obtido exatamente de uma das tabelas base
    * chave primária desta tabela base estiver incluída na visão ou gerada automaticamente
  • III - É impossível fazer update em visões geradas por junções em mais de uma tabela.
    Eu não entendi porque esse item está errado, uma vez que diz o Silberchatz que as views definidas sobre múltiplas tabelas usando joins geralmente não são atualizaveis, porém, uma view pode ser atualizável se todas as condições a seguir forem verdadeiras:

    - a clausula from possui apenas 1 relacao de BD;

    Ai é a dúvida se é em joins vai ter mais de uma relação como eu vou conseguir atualizar seguindo essa regra ? Sendo que  no item fala  em "junções em mais de uma tabela." ou seja terá mais de uma tabela.

     

    Silberchatz acrescenta q as views definidas sobre multiplas tabelas usando joins "geralmente" nao sao atualizaveis(O q torna a alternativa III errada). Porem, uma view pde ser atualizavel se todas as condicoes a seguir forem verdadeiras:
    - a clausula from possui apenas 1 relacao de BD;
    - a clausula select contem apenas nomes de atributo da relacao e nao possui quaisquer expressoes, agregadas ou especificação distinct
    - qqr atributo nao listado na clausula select pde ser definido em nulo;