SóProvas


ID
836641
Banca
CESPE / CEBRASPE
Órgão
ANAC
Ano
2012
Provas
Disciplina
Banco de Dados
Assuntos

Acerca do sistema gerenciador de banco de dados Oracle, julgue os itens a seguir.

No Oracle 10g, uma view pode ser utilizada para inserção de dados, porém, essa inserção não é possível em views que contenham os operadores DISTINCT ou MINUS.

Alternativas
Comentários
  • Para que uma view possa alterar dados, dentre outras exigências, não pode conter cláusulas como DISTINCT e deve conter apenas um SELECT, o que não é feito utilizando o comando MINUS (em outros bancos EXCEPT DISTINCT) pois quando é utilizado se usa mais de um SELECT, pois são operações entre conjunto de dados.
    Abraços, vamo que vamos.
  • Não vi o erro da questão. Alguém pode me explicar?
  • A inserção de dados em view não é possivel quando:
    • Subquery in the select list (a cláusula MINUS exige uma subquery)

    • DISTINCT



    Referências:
    http://docs.oracle.com/cd/E17952_01/refman-5.1-en/view-updatability.html

    http://www.techonthenet.com/sql/minus.php

    Enfim, item CERTO!
  • Gabarito alterado de CERTA para ERRADA
    Justificativa da banca: No Oracle10g uma view pode ser utilizada para isenção de dados, inclusive essa inserção é possível ser realizada em views que contenham os operadores DISTINC ou MINUS, motivo pelo qual se opta pela alteração do gabarito do item.

    Continuo sem enteder.

    Fonte: http://www.cespe.unb.br/concursos/ANAC_12/arquivos/ANAC_2012_JUSTIFICATIVAS_DE_ALTERA____ES_DE_GABARITONOVO.PDF
  • Descobri o que pode ter acontecido!!
     
    Leiam até o final...
     
    SQL> create table x (x1 number, x2 number);
    Table created.
     
    SQL> insert into x values (1,1);
    SQL> insert into x values (1,2);
    SQL> insert into x values (2,1);
    SQL> insert into x values (1,1);
    ...
     
    SQL> create table y (y1 number, y2 number);
    Table created.
     
    SQL> insert into y values (1,2);
    1 row created.
     
    SQL> create view xx as select distinct x1,x2 from x;
    View created.
     
    SQL> create view xy as select x1,x2 from x minus select y1,y2 from y;
    View created.
     
    SQL> insert into xx values (3,3);
    insert into xx values (3,3)
                *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view
     
    SQL> insert into xy values (3,3);
    insert into xy values (3,3)
                *
    ERROR at line 1:
    ORA-01732: data manipulation operation not legal on this view
     
    ! ! ! ! !
     
    Até aqui eu estava xingando o CESPE e dando graças a Deus por não ter feito esta prova, mas ao analisar mais atentamente a situação:
     
    FATO: Não era pegadinha, a questão originalmente estava CERTA e o CESPE alterou para ERRADO, justificando que era possível incluir dados em views com  DISTINCT e MINUS.
     
    Conclui-se então que algum candidato que originalmente errou a questão (marcando "E") deu um jeito de fazer um INSERT em uma view com DISTINCT ou MINUS, e eu tratei de encontrar um jeito de tornar isso possível.
     
    Encontrei não somente um, mas DOIS jeitos:
     
    ! ! ! ! !
     
    Jeitinho No. 1: No enunciado não diz que a view necessariamente tem DISTINCT ou MINUS na query principal. Estes operadores podem estar em subqueries! A view desta forma tem DISTINCT e MINUS, e sendo a query principal uma query simples, a view aceita INSERT:
     
    SQL> create view xupd as select x1,x2 from x
      2  where (x1,x2) not in (select distinct y1,y2 from y)
      3  and x2 in (select x1 from y minus select y2 from y);
    View created.
     
    SQL> select * from xupd;
            X1         X2
    ---------- ----------
             1          1
             1          1
     
    SQL> insert into xupd values (3,3);
    1 row created.
     
    ! ! ! ! !
     
    Jeitinho No. 2: No Oracle é possível criar triggers INSTEAD OF para views, que executam um código PL/SQL quando o usuário tenta fazer um INSERT na view, ao invés de fazer o INSERT diretamente. Fica assim:
     
    SQL> create or replace trigger xxio instead of insert on xx
      2  referencing new as new old as old
      3  begin
      4  insert into x values (:new.x1, :new.x2);
      5  end;
      6  /
    Trigger created.
     
    SQL> insert into xx values (4,4);
    1 row created.
     
    SQL> commit;
    Commit complete.
     
     
    RÁÁÁÁÁÁ!!!
  • Amigos, a questão fala que é a view que contém os operadores DISTINCT ou MINUS e não a subquery que será usada para atualizar essa view. Pegadinha.

  • A galera tenta justificar o gabarito da questão, pra quê? quem não daria CERTO nessa questão? Eu nem vou colocar no resumo, VIEW com DISTINCT não pode ser atualizada e ponto, é isso que tá no meu resumo, é isso que eu sempre aprendi... Sem gambiarras pessoal, a CESPE vacilou na questão