SóProvas


ID
17797
Banca
CESGRANRIO
Órgão
BNDES
Ano
2008
Provas
Disciplina
Banco de Dados
Assuntos

Um funcionário, encarregado de verificar o correto funcionamento de uma base de dados relacional, faz o seguinte teste:

select nome from emp where matr = 123;

O resultado é vazio. Então ele executa:

insert into emp(matr, nome, salario, ativo)
values (123, 'José da Silva', 2000, 'N');
commit;

O banco de dados não retorna erro e informa que inseriu uma linha.
Por fim, para verificar, ele consulta novamente:

select nome from emp where matr = 123;

O resultado continua vazio.

Supondo que o sistema gerenciador de banco de dados esteja funcionando corretamente, que opção explica o ocorrido?

Alternativas
Comentários
  • É realmente possível fazer uma inclusão de dados em uma view e o banco não dar nenhuma mensagem de erro?
  • CHECK OPTION torna a view atualizável.

    CREATE VIEW empr(matr, nome, salario, ativo) AS
    (SELECT matr, nome, salario, ativo)
    WITH CHECK OPTION;

    INSERT INTO empr(123, 'Washington Botelho', 2000, 'N');

    Deus nos abençoe!


  • Utilizando a Cláusula WITH CHECK OPTION

    • Pode-se garantir que um DML sobre uma view obedeça o domínio estabelecido para a view utilizando-se a cláusula WITH CHECK OPTION

    Exemplo:
    CREATE OR REPLACE VIEW emp20
    AS SELECT * FROM emp
    WHERE deptno = 20
    WITH CHECK OPTION CONSTRAINT emp20_ck;
    • Qualquer tentativa de se alterar o departamento
    de qualquer linha da view irá falhar, pois viola o
    constraint de WITH CHECK OPTION.

    WITH CHECK OPTION somente será aceita em meio a uma View atualizável; caso aquela que você vier a definir não seja atualizável, um erro será enviado e a mesma não será criada.

    Fonte:
    http://www.fesppr.br/~helder/Graduacao/Aulas%20-%20SQL5.pdf
  • Eu nao entendi essa resposta.

    O funcionário inseriu alguem com atributo ativo = N.

    Partindo desse fato, entao nao faz sentido que a expressao retornasse alguma resposta, pois mesmo que a visao emp retornasse todos aqueles que tivesssem ativo = S, o inserido tem ativo = N. Sendo assim, penso que o item c nao é a resposta.

    Ao mesmo tempo, eu acho que o item d é o correto, pelos argumentos já citados.

    Por favor, alguem pode me explicar a questao?

  • A cláusula WITH CHECK OPTION pode opcionalmente ser inserida na sentença de criação de uma VIEW, e especifica o nível de verificação que será realizado ao inserir/atualizar um registro de dentra da VIEW. Se for especificada, toda linha que é inserida/atualizada através da VIEW deverá estar em conformidade com as regras definidas na VIEW.

    A questão nos dá as seguintes informações:
    1> select que retorna vazio
    2> uma inserção
    3> select continua retornando vazio

    Passemos aos itens que gerariam dúvidas:

    c) "emp" é uma visão que retorna todos os empregados ativos (ativo='S'), mas foi criada sem a expressão WITH CHECK OPTION, que evitaria o problema acima.
    Correto: Como foi possível a inserção a cláusula WITH CHECK OPTION não foi inserida na view, pois do contrário a inserção retornaria um erro. Conforme figura abaixo.

    http://goo.gl/qHU6y



    d) "emp" não é uma tabela, mas uma visão que retorna todos os empregados ativos (ativo='S') e foi criada com a expressão WITH CHECK OPTION. Dessa forma, como o empregado José da Silva não está ativo, o banco de dados não gravou o registro no momento do COMMIT.
    Errado: Esse cenário não condiz com as informações fornecidas no comando da questão, pois temos que a inserção e em seguida commit foram realizados com sucesso.
    •  
  • Armando, vamos analisar:
    - a cláusula With Check Option força que os critérios de seleção da view sejam respeitadas nos comandos Insert e Update; (caso seja omitida as atualizações são feitas sem obedecer os critérios de seleção da view)
    - no enunciado afirma que o registro foi incluído na base de dados, sem qualquer mensagem de erro;
    - o item C afirma que a visão filtra os funcionários ativos, então pode-se concluir com o restante do enunciado que para que a inclusão tenha ocorrido a cláusula With Check Option não pode estar ativa;
    - no item D há a afirmação que o registro não foi gravado o que é uma contradição com o enunciado. 

    Espero ter ajudado. Bons estudos.
  • Calma galera, bora começar pelo começo.
    Primeiro: Uma view pode sim ser usada para manipular dados em um banco, desde que ela seja uma view de consulta simples (passe apenas em uma tabela).
    Segundo: A cláusula WITH CHECK OPTION não é o que torna a view passível de manipular dados, ela apenas impõe uma restrição view para que ela manipule apenas os dados que são visíveis por ela.
    Quando a questão afirmou que o usuário fez um INSERT através VIEW e o banco não retornou erro nenhum, então é porque nenhuma restrição nem da tabela base e nem da view foram quebradas. Então por que que a consulta não retornou o dado? Porque é uma dado não visível por ela.
    A única alternativa que cabe é a C.