Baixe o app para aproveitar ainda mais
Prévia do material em texto
23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 1/19 Revisar envio do teste: Clique aqui para iniciar o Quiz STBDCAS3DA_2203-2203-695399 2203-PROGRAMAÇÃO DE BANCO DE DADOS Quiz REVISAR ENVIO DO TESTE: CLIQUE AQUI PARA INICIAR O QUIZ Usuário JOAO PEDRO ARAUJO RODRIGUES DA ROCHA Curso 2203-PROGRAMAÇÃO DE BANCO DE DADOS Teste Clique aqui para iniciar o Quiz Iniciado 23/09/22 10:38 Enviado 23/09/22 10:45 Data de vencimento 28/09/22 23:59 Status Completada Resultado da tentativa 9 em 10 pontos Tempo decorrido 7 minutos Resultados exibidos Todas as respostas, Respostas enviadas, Respostas corretas, Comentários Pergunta 1 Ataques de colisão SHA-1 agora são realmente práticos e criptogra�a se torna um perigo iminente O primeiro ataque de colisão de SHA-1 bem-sucedido no mundo real, conhecido como “SHAttered”, foi realizado em 2017. Acadêmicos da Google produziram dois arquivos que tinham o mesmo hash SHA-1. A pesquisa custou apenas U$ 110.000 para ser executada usando o poder de computação alugado pela nuvem, muito menos do que as pessoas achavam que poderia custar. Mas na semana passada, uma equipe de acadêmicos da França e Cingapura deram um passo adiante, demonstrando um ataque de colisão SHA-1 com “pre�xo escolhido”: “Encontrar um ataque de colisão prático interrompe a função hash, mas o dano real que pode ser causado com essa colisão é um pouco limitado, já que o invasor terá pouco ou nenhum controle sobre os dados reais que colidem”, a�rmou Thomas Peyrin, um dos pesquisadores do estudo. Sala de Aula Tutoriais 1 em 1 pontos JOAO PEDRO ARAUJO RODRIGUES DA ROCHA https://senacsp.blackboard.com/webapps/blackboard/execute/courseMain?course_id=_190208_1 https://senacsp.blackboard.com/webapps/blackboard/content/listContent.jsp?course_id=_190208_1&content_id=_8513708_1&mode=reset https://www.ead.senac.br/ https://senacsp.blackboard.com/webapps/portal/execute/tabs/tabAction?tab_tab_group_id=_193_1 https://senacsp.blackboard.com/webapps/portal/execute/tabs/tabAction?tab_tab_group_id=_210_1 https://senacsp.blackboard.com/webapps/login/?action=logout 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 2/19 Resposta Selecionada: a. Respostas: a. b. “Um ataque muito mais interessante é encontrar uma chamada ‘colisão de pre�xo escolhido’, onde o invasor pode escolher livremente o pre�xo para as duas mensagens as colidindo. Tais colisões mudam tudo em termos de ameaça porque agora você pode considerar ter colisões com dados signi�cativos dentro (como nomes ou identidades em um certi�cado digital, etc.).” Os fornecedores de navegadores há muito tempo começaram a suspender o suporte para o tráfego TLS assinado pelo SHA-1 dentro de seus produtos; no entanto, outros aplicativos ainda contam com isso. Todos devem mudar para (em ordem de preferência): BLAKE2b / BLAKE2s, SHA-512/256, SHA3-256, SHA-384 ou qualquer outra função hash da família SHA2 como último recurso. “Mas o SHA1 não deve mais ser usado. Sem desculpas”, disse Arciszewski. (Fonte: SEGINFO. Ataques de colisão SHA-1 agora são realmente práticos e criptografia se torna um perigo iminente. SegInfo. 20 maio 2019. Disponível em: https://seginfo.com.br/2019/05/20/ataques-de-colisao-sha-1-ago ra-sao-realmente-praticos-e-criptografia-se-torna-um-perigo-iminente/. Acesso em: 18 nov. 2020.) Assinale a alterna�va que melhor explica e resume a no�cia fornecida. Existem diversas funções de hash (resumos criptográficos). Uma propriedade importante de uma função hash é que deve ser muito di�cil encontrar duas mensagens com o mesmo resumo (uma colisão). Os cien�stas da Google encontraram duas mensagens com o mesmo resumo usando a função SHA-1 (encontraram uma colisão). Posteriormente, outros pesquisadores conseguiram outro �po de colisão mais perigosa da SHA-1: eles escolheram parte das mensagens colididas. Por isso, a função SHA-1 deve ser evitada. Existem diversas funções de hash (resumos criptográficos). Uma propriedade importante de uma função hash é que deve ser muito di�cil encontrar duas mensagens com o mesmo resumo (uma colisão). Os cien�stas da Google encontraram duas mensagens com o mesmo resumo usando a função SHA-1 (encontraram uma colisão). Posteriormente, outros pesquisadores conseguiram outro �po de colisão mais perigosa da SHA-1: eles escolheram parte das mensagens colididas. Por isso, a função SHA-1 deve ser evitada. 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 3/19 c. d. e. Comentário da resposta: Existem diversas funções de hash (resumos criptográficos). Uma propriedade importante de uma função hash é que deve ser muito di�cil encontrar duas mensagens com o mesmo resumo (uma colisão). Os cien�stas da Google encontraram duas mensagens com o mesmo resumo usando a função SHA-1 (encontraram uma colisão). Posteriormente, outros pesquisadores conseguiram outro �po de colisão mais perigosa da SHA-1: eles escolheram parte dos resumos colididos. Por isso, as funções de hash devem ser evitadas. Existem diversas funções de hash (resumos criptográficos). Uma propriedade importante de uma função hash é que ela deve ser cara de se computar (a Google, por exemplo, gastou U$ 110.000). Porém, posteriormente outros pesquisadores encontraram uma forma mais barata de se computar a função SHA-1, o que coloca em risco o sistema criptográfico. Existem diversas funções de hash (também chamadas de funções de colisão). Uma propriedade importante de uma função hash é que deve ser muito di�cil encontrar os resumos de colisões dis�ntas. Os cien�stas da Google encontraram tais resumos para a função SHA-1. Posteriormente, outros pesquisadores conseguiram aprimorar a função SHA-1 de forma a limitar o real dano causado por esse �po de ataque. Existem diversas funções de hash (também chamadas de funções de colisão). Os cien�stas da Google encontraram duas mensagens com o mesmo resumo usando a função SHA-1. Posteriormente, outros pesquisadores conseguiram outro �po de colisão mais perigosa: eles escolheram parte das mensagens colididas. Por isso, as funções de hash devem ser evitadas. A no�cia mostra a evolução de ataques progressivamente mais perigosos contra a função de hash SHA-1. Funções de hash devem ser robustas a colisões, mas esses ataques mostram que a função SHA-1 não contempla de forma tão forte tal requisito. Por isso, os especialistas já recomendam a aposentadoria da função SHA-1, mas existem várias outras funções de hash que ainda podem ser usadas. Pergunta 2 Considere a seguinte tabela, que armazena os resultados das partidas de um campeonato de futebol: CREATE TABLE partidas (id_time1 int, id_time2 int, gols_time1 int, gols_time2 int); A cada partida, um time: 1 em 1 pontos 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 4/19 Resposta Selecionada: d. Ganha 3 pontos se vencer a partida. Ganha 1 ponto se empatar a partida. Ganha 0 pontos se perder a partida. Após cada partida, os valores da coluna pontuacao da tabela campeonato são atualizados com o seguinte comando (a pontuação é a soma dos pontos): UPDATE campeonato SET pontuacao = pontuacao(id_time); Sendo a função pontuacao definida conforme segue: DELIMITER $$ CREATE FUNCTION pontuacao(id_time int) RETURNS int deterministic BEGIN DECLARE pontuacao_como_time1, pontuacao_como_time2 int; SELECT SUM(pontos_pra_time1(gols_time1, gols_time2)) INTO pontuacao_como_time1 FROM partidasWHERE id_time1 = id_time; SELECT SUM(pontos_pra_time2(gols_time1, gols_time2)) INTO pontuacao_como_time2 FROM partidas WHERE id_time2 = id_time; RETURN IFNULL(pontuacao_como_time1, 0) + IFNULL(pontuacao_como_time2, 0); END$$ DELIMITER ; Mas, para que a função pontuacao funcione, é preciso definir as funções pontos_pra_time1 e pontos_pra_time2. Essas funções podem ser implementadas utilizando tanto o comando IF, quanto o comando CASE. Selecione a alternativa que possui as versões corretas para pontos_pra_time1 e pontos_pra_time2, tanto com IF, quanto com CASE. 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 5/19 Respostas: a. b. Versões com IF: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 3, IF(gols_time1 = gols_time2, 1, 0)); CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 0, IF(gols_time1 = gols_time2, 1, 3)); Versões com CASE: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time1 > gols_time2 THEN 3 WHEN gols_time1 = gols_time2 THEN 1 WHEN gols_time1 < gols_time2 THEN 0 END; CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time2 > gols_time1 THEN 3 WHEN gols_time2 = gols_time1 THEN 1 WHEN gols_time2 < gols_time1 THEN 0 END; Versões com IF: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 3, ELSEIF(gols_time1 = gols_time2, 1, 0)); CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 0, ELSEIF(gols_time1 = gols_time2, 1, 3)); Versões com CASE: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time1 > gols_time2 THEN 3 WHEN gols_time1 = gols_time2 THEN 1 WHEN gols_time1 < gols_time2 THEN 0 END; CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time2 > gols_time1 THEN 3 WHEN gols_time2 = gols_time1 THEN 1 WHEN gols_time2 < gols_time1 THEN 0 END; 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 6/19 c. d. Versões com IF: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 3, IF(gols_time1 = gols_time2, 1, ELSE(0))); CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 0, IF(gols_time1 = gols_time2, 1, ELSE(3))); Versões com CASE: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time1 > gols_time2 THEN 3 WHEN gols_time1 = gols_time2 THEN 1 WHEN gols_time1 < gols_time2 THEN 0 END; CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time2 > gols_time1 THEN 3 WHEN gols_time2 = gols_time1 THEN 1 WHEN gols_time2 < gols_time1 THEN 0 END; Versões com IF: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 3, IF(gols_time1 = gols_time2, 1, 0)); CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 0, IF(gols_time1 = gols_time2, 1, 3)); Versões com CASE: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE gols_time1 WHEN > gols_time2 THEN 3 WHEN gols_time2 THEN 1 WHEN < gols_time2 THEN 0 END; CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time2 > gols_time1 THEN 3 WHEN gols_time1 THEN 1 WHEN < gols_time1 THEN 0 END; 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 7/19 e. Comentário da resposta: Versões com IF: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 3, IF(gols_time1 = gols_time2, 1, 0)); CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 0, IF(gols_time1 = gols_time2, 1, 3)); Versões com CASE: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time1 > gols_time2 THEN 3 WHEN gols_time1 = gols_time2 THEN 1 WHEN gols_time1 < gols_time2 THEN 0 END; CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time2 > gols_time1 THEN 3 WHEN gols_time2 = gols_time1 THEN 1 WHEN gols_time2 < gols_time1 THEN 0 END; Versões com IF: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 3, IF(gols_time1 = gols_time2, 1, ELSE(0))); CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN IF (gols_time1 > gols_time2, 0, IF(gols_time1 = gols_time2, 1, ELSE(3))); Versões com CASE: CREATE FUNCTION pontos_pra_time1(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE gols_time1 WHEN > gols_time2 THEN 3 WHEN gols_time2 THEN 1 WHEN < gols_time2 THEN 0 END; CREATE FUNCTION pontos_pra_time2(gols_time1 int, gols_time2 int) RETURNS int deterministic RETURN CASE WHEN gols_time2 > gols_time1 THEN 3 WHEN gols_time1 THEN 1 WHEN < gols_time1 THEN 0 END; A alternativa D possui implementações corretas para pontos_pra_time1 e pontos_pra_time2 utilizando adequadamente as sintaxes dos comandos IF e CASE. Em cada função temos três situações: vitória, derrota ou empate. Isso leva as implementações com IF a terem um IF na expressão ELSE de outro IF e as implementações com CASE a terem três cláusulas WHEN. A alternativa A está errada, pois não existe a função ELSEIF. A alternativa B está errada, pois não existe a função ELSE. A alternativa C está errada, pois os termos tipo “WHEN < gols_time1” são inválidos. 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 8/19 A alternativa E está errada, pois contém os erros das alternativas B e C. Pergunta 3 Considere as seguintes sequências de comandos. Sequência 1: TRUNCATE pet; TRUNCATE dono; DROP procedure novo_pet_para_dono; INSERT INTO dono(nome) VALUES ('nome_dono'); DELIMITER $$ CREATE PROCEDURE novo_pet_para_dono(IN nome_dono text) BEGIN DECLARE nome_pet text; DECLARE id_dono int; SET nome_pet = CONCAT('Pet ', ROUND(RAND()*100)); SELECT id INTO id_dono FROM dono WHERE nome = nome_dono; IF id_dono is not NULL THEN INSERT INTO pet (nome, id_dono) VALUES (nome_pet, id_dono); END IF; END$$ DELIMITER ; SELECT COUNT(*) FROM pet; Sequência 2: TRUNCATE pet; TRUNCATE dono; DROP procedure novo_pet_para_dono; DELIMITER $$ CREATE PROCEDURE novo_pet_para_dono(IN nome_dono text) 1 em 1 pontos 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_85137… 9/19 Resposta Selecionada: e. Respostas: a. b. c. d. e. Comentário da resposta: BEGIN DECLARE nome_pet text; DECLARE id_dono int; SET nome_pet= CONCAT('Pet ', ROUND(RAND()*100)); SELECT id INTO id_dono FROM dono WHERE nome = nome_dono; IF id_dono is not NULL THEN INSERT INTO pet (nome, id_dono) VALUES (nome_pet, id_dono); END IF; END$$ DELIMITER ; CALL novo_pet_para_dono('nome_dono'); SELECT COUNT(*) FROM pet; Assinale a alternativa que apresenta corretamente a saída do último comando de cada sequência. Sequência 1 – 0. Sequência 2 – 0. Sequência 1 – erro de sintaxe. Sequência 2 – 0. Sequência 1 – 1. Sequência 2 – 1. Sequência 1 – 0. Sequência 2 – 1. Sequência 1 – 1. Sequência 2 – 0. Sequência 1 – 0. Sequência 2 – 0. Como o IF é avaliado somente quando da execução do procedimento, e não de sua declaração, a sequência 1 acaba não inserindo nenhum registro, pois nem sequer invoca o procedimento. 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 10/19 Já a sequência 2 não insere nenhum registro, pois quando o procedimento é invocado não existe registro com nome “nome_dono” na tabela dono. Pergunta 4 Resposta Selecionada: e. Respostas: a. b. c. d. e. Comentário da resposta: Considere as seguintes declarações: CREATE TRIGGER audita_insercao BEFORE INSERT ON produto FOR EACH ROW INSERT INTO produto_auditoria (data_hora_alteracao, usuario, evento, id_produto) VALUES (NOW(), CURRENT_USER(), 'INCLUSAO', NEW.id); CREATE TRIGGER audita_exclusao BEFORE DELETE ON produto FOR EACH ROW FOLLOWS audita_insercao INSERT INTO produto_auditoria (data_hora_alteracao, usuario, evento, id_produto) VALUES (NOW(), CURRENT_USER(), 'EXCLUSAO', OLD.id); Sobre a execução desses comandos, é correto dizer: A declaração de audita_exclusao resulta em erro. Ambas as declarações funcionam, mas audita_exclusao nunca será disparada. Ambas as declarações funcionam, mas audita_exclusao dará erro quando disparada. Há um erro de sintaxe em audita_insercao. As palavras NEW e OLD foram usadas indevidamente. A declaração de audita_exclusao resulta em erro. A palavra-chave FOLLOWS deve apontar para um gatilho que opere com a mesma tabela e comando (INSERT, UPDATE, DELETE) que o gatilho sendo declarado. Isso quer dizer que audita_exclusao não pode seguir (FOLLOWS) audita_insercao, pois são gatilhos de comandos diferentes (um é INSERT e o outro é DELETE). Assim, a alternativa correta é a “e”, pois a declaração de audita_exclusao produz o seguinte erro: ERROR 3011 (HY000): Referenced trigger 'audita_insercao' for the given ac�on �me and event type does not exist. 1 em 1 pontos 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 11/19 Pergunta 5 Resposta Selecionada: d. Respostas: a. b. c. d. e. Comentário da resposta: Considere as seguintes afirmações: I – A auditoria baseada em gatilhos pode fornecer informações mais detalhadas e customizadas sobre as manipulações dos registros do que os logs fornecidos pelo MySQL, contudo é bem mais trabalhosa de se implantar, pois, nesse caso, devemos programar diversos gatilhos. II – A auditoria baseada em gatilhos não possui grande valor, já que os gatilhos se aplicam somente aos comandos SQL disparados por um usuário diretamente conectado ao SGBD, e não pelos comandos disparados via aplicação. III – A auditoria baseada em gatilhos é uma medida preventiva e efetiva contra DBAs maliciosos. Assinale a alternativa que contém todas as afirmações verdadeiras. I. I, II e III. I e II. II e III. I. III. I – Verdadeira, pois, com a auditoria baseada em gatilhos, podemos determinar as informações que farão parte da auditoria, enquanto que nos logs do MySQL devemos aceitar a estrutura já fornecida. II – Falsa, pois os gatilhos também se aplicam aos comandos SQL vindos da aplicação. Afinal, tanto uma pessoa administradora quanto a aplicação acessam o SGBD utilizando um usuário do banco de dados. III – Falsa, pois o DBA, com plenos poderes administra�vos sobre o SGBD, pode sempre remover os ga�lhos que desejar. O cargo de DBA, com plenos poderes administra�vos sobre o SGBD, é um cargo de extrema confiança. Pergunta 6 Considere o cenário da questão 7. Um programador escreveu a seguinte função para atualizar o campo pontuacao da tabela campeonato: 1 em 1 pontos 1 em 1 pontos 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 12/19 Resposta Selecionada: a. Respostas: a. DELIMITER $$ CREATE FUNCTION atualiza_pontuacao(id_do_time int) RETURNS int deterministic BEGIN DECLARE pontuacao_como_time1, pontuacao_como_time2, pts int; SELECT SUM(pontos_pra_time1(gols_time1, gols_time2)) INTO pontuacao_como_time1 FROM partidas WHERE id_time1 = id_do_time; SELECT SUM(pontos_pra_time2(gols_time1, gols_time2)) INTO pontuacao_como_time2 FROM partidas WHERE id_time2 = id_do_time; SET pts = IFNULL(pontuacao_como_time1, 0) + IFNULL(pontuacao_como_time2, 0); UPDATE campeonato SET pontuacao = pts WHERE id_time = id_do_time; RETURN pts; END$$ DELIMITER ; Além das tabelas partidas e campeonato, o banco de dados possui ainda a tabela times, que contém as colunas id_time e nome. Após cada partida, o programador invoca a função atualiza_pontuacao com o seguinte comando: SELECT id_time, atualiza_pontuacao(id_time) as pontuacao FROM times; Sobre os efeitos causados pelo comando acima, assinale a alternativa correta. O comando executará sem erros e causará o efeito colateral desejado. Contudo, alguns podem considerar essa situação um tanto quanto confusa, uma vez que a atualização é feita com o comando SELECT, que é um comando de leitura. Além disso, a implementação quebra o princípio de que uma função deveria apenas retornar valores, sem causar efeitos colaterais. O comando executará sem erros e causará o efeito colateral desejado. Contudo, alguns podem considerar essa situação um tanto quanto confusa, uma vez que a atualização é feita com o comando SELECT, que é um comando de leitura. Além disso, a implementação quebra o princípio de que uma função deveria apenas retornar valores, sem causar efeitos colaterais. 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 13/19 b. c. d. e. Comentário da resposta: Não será possível executar esse comando, pois a criação da função já terá falhado, uma vez que uma função não pode alterar o estado do banco de dados. O comando executará com erros, pois uma função não pode alterar o estado do banco de dados. Como o MySQL não avalia semanticamente o conteúdo de uma função, esse erro não se manifesta no momento da criação da função. Não será possível executar esse comando, pois a criação da função já terá falhado, uma vez que a definição dessa função possui erros de sintaxe. O comando executará sem erros, mas o efeito colateral provocado não será o desejado. Durante a execução, o comando UPDATE será ignorado, uma vez que uma função não pode alterar o estado do banco de dados. Todos os comandos exibidos estão corretos e funcionarão, nenhum erro será lançado a nenhum momento. Contudo, do ponto de vista de código limpo, essa pode não ser a melhor solução, conforme esclarece a alternativa A. Pergunta 7 Considere a seguinte tabela usuario e sua tabela de auditoria usuario_auditoria: > describe usuario; +-------+------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | nome | text| YES | | NULL | | | papel | text | YES | | NULL | | +-------+------+------+-----+---------+----------------+ > describe usuario_auditoria; +----------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | data_hora_acao | datetime | YES | | NULL | | | usuario_acao | text | YES | | NULL | | | id_usuario | int | YES | | NULL | | | nome_antes | text | YES | | NULL | | 1 em 1 pontos 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 14/19 Resposta Selecionada: b. Respostas: a. b. c. d. e. Comentário da resposta: | papel_antes | text | YES | | NULL | | | nome_depois | text | YES | | NULL | | | papel_depois | text | YES | | NULL | | +----------------+----------+------+-----+---------+----------------+ Considere as seguintes versões do gatilho responsável por inserir um registro de auditoria de inserção de usuário: CREATE TRIGGER audita_insercao_v1 BEFORE INSERT ON usuario FOR EACH ROW INSERT INTO usuario_auditoria (data_hora_acao, usuario_acao, id_usuario, nome_depois, papel_depois) VALUES (NOW(), CURRENT_USER(), NEW.id, NEW.nome, NEW.papel); CREATE TRIGGER audita_insercao_v2 AFTER INSERT ON usuario FOR EACH ROW INSERT INTO usuario_auditoria (data_hora_acao, usuario_acao, id_usuario, nome_depois, papel_depois) VALUES (NOW(), CURRENT_USER(), NEW.id, NEW.nome, NEW.papel); Assinale a alternativa correta. A versão 2 está correta, enquanto que a versão 1 possui um problema: pode não registrar o ID do usuário inserido. A versão 2 está correta, enquanto que a versão 1 sempre deixará nulos os campos id_usuario, nome_depois e papel_depois. A versão 2 está correta, enquanto que a versão 1 possui um problema: pode não registrar o ID do usuário inserido. Ambas as versões estão igualmente corretas. Ambas as versões possuem erros de sintaxe. Somente a versão 1 está correta. A versão 1 possui tempo de ação BEFORE (antes), e antes da ação ainda não há um ID gerado para o registro (caso o ID não seja especificado no comando INSERT*). Por isso, a versão 1 pode não auditar o ID do registro inserido. 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 15/19 Exemplo: insert into usuario (nome, papel) values ('joao', 'operario'); Já a versão 2 (AFTER) funciona corretamente. Pergunta 8 Considere que você está desenvolvendo uma aplicação para o Ministério da Saúde que consiste em uma série de painéis de monitoramento de uma pandemia. A arquitetura do sistema segue a figura abaixo: front-end usando JavaScript/Angular, back-end em Python e banco de dados MySQL. Nessa arquitetura, o banco de dados está sendo continuamente alimentado por outra equipe com dados atualizados sobre a pandemia. Considere agora que você deve construir um painel exibindo dois números: a média e o desvio padrão da idade dos casos de óbito (por exemplo, o painel responde à pergunta “em média, quantos anos tinham as pessoas que morreram na pandemia?”). Observação: o desvio padrão é uma medida estatística de dispersão que não possui implementação pronta no MySQL. Para esse problema, você, a princípio, pensa em duas soluções: (I) A aplicação Python se conecta ao banco de dados e executa um SELECT para obter as idades dos casos de óbitos. Uma vez que os dados estejam na aplicação Python, calcula-se a média e o desvio padrão das idades. (II) Você cria um procedimento armazenado no MySQL que calcula a média e o desvio padrão das idades dos casos de óbitos, armazenando esses resultados em uma tabela. Assim, a aplicação Python periodicamente invoca o procedimento que atualiza esses sumários (média e desvio padrão) e, quando tiver que retorná-los 1 em 1 pontos 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 16/19 Resposta Selecionada: c. Respostas: a. b. c. d. e. Comentário da resposta: ao front-end, faz a pesquisa com um SELECT na tabela com os valores já calculados. Sobre as duas possíveis soluções, assinale a alternativa correta. Ambas as soluções funcionarão corretamente, mas há uma chance de que a solução II seja mais eficiente, pois na solução I uma grande quantidade de dados deverá trafegar na rede. O uso de stored procedures é considerado uma má prática, então a solução II deve ser totalmente desconsiderada. É impossível implementar a solução II, pois ela depende de recursos que existem somente em uma linguagem de programação completa, como o Python. Ambas as soluções funcionarão corretamente, mas há uma chance de que a solução II seja mais eficiente, pois na solução I uma grande quantidade de dados deverá trafegar na rede. A solução I não é possível, pois o MySQL não aceita Python como linguagem de programação. A solução II não será viável sem antes a atualização do MySQL para um SGBD mais robusto. A alternativa C é a correta. Podemos implementar a lógica tanto dentro do banco (stored procedures), quanto fora dele (no Python). Porém, na solução I, de fato os dados têm que ser todos transferidos para a aplicação para que os cálculos possam ser efetuados. E com uma grande quantidade de casos, essa transferência (que ocorre via rede) pode ser custosa. Embora, geralmente, o armazenamento de regras de negócio no banco de dados não seja uma boa prática, não é algo que deva ser sempre totalmente desconsiderado. No mais, em nosso exemplo, estamos armazenando no banco procedimentos matemáticos comuns, nem chegando a ser de fato uma violação da boa prática. Por isso, a alternativa A está errada. A alternativa B está errada, pois, conforme estamos estudando no curso, o MySQL fornece a opção de criação de rotinas armazenadas com os recursos de uma linguagem de programação típica (variáveis, laços de repetição, controles de fluxo por condicionalidade, etc.). 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 17/19 A alternativa D está errada, pois, na solução I, o Python interage com o banco de dados por meio da SQL – a linguagem Python não é executada dentro do banco de dados. Tendo as bibliotecas adequadas, praticamente qualquer linguagem de programação pode se conectar a um banco MySQL. Até que se prove o contrário, a solução II é viável no MySQL. Se não for viável por uma questão de tempo de processamento ou algo parecido, não será a mera troca do SGBD que resolverá o problema – talvez será preciso uma rearquitetura e aplicar alguma solução distribuída do tipo map reduce. Por isso, a alternativa E está errada. Pergunta 9 Resposta Selecionada: b. Respostas: a. Considere as seguintes situações: A – Uma aplicação web é usada por vários diplomatas para a pesquisa de comunicações diplomáticas sigilosas. Há um módulo de entrada de novas comunicações, mas a aplicação nunca exclui uma comunicação. Contudo, um discurso sumiu do banco de dados. Se não foi da aplicação, de onde veio o comando de deleção? B – Uma aplicação web é usada por escreventes para o gerenciamento de penas impostas por juízes e usada pelos juízes para consultar essas penas. A aplicação permite incluir, alterare excluir penas. Um juiz percebeu que uma pena foi indevidamente excluída. Qual escriturário excluiu a pena? C – Uma empresa que mantém um sistema web está recebendo reclamações de que seu sistema está lento, contudo as reclamações são vagas, ninguém fala exatamente o que está lento. O que será que está lento? Considere agora os seguintes logs nativos do MySQL: I – general log. II – slow query log. III – error log. IV – binary log. V – DDL log. Assinale a alternativa que relaciona os logs que melhor poderão ajudar em cada situação. A – I. B – nenhum dos logs será conclusivo. C – II. A – I. B – I. C – II. 1 em 1 pontos 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 18/19 b. c. d. e. Comentário da resposta: A – I. B – nenhum dos logs será conclusivo. C – II. A – nenhum dos logs ajudará. B – nenhum dos logs ajudará. C – nenhum dos logs ajudará. A – I. B – V. C – III. A – III. B – I. C – IV. A – Em caso de a aplicação não possuir funcionalidade de exclusão, é interessante verificar o usuário do banco que disparou a ação e de que host esse usuário estava agindo. Para isso, o general log pode ajudar. B – Os usuários da aplicação (escreventes, juízes) são um conceito pertencente à aplicação, sendo invisíveis para os logs do MySQL. Portanto, nenhum log do MySQL revelará o usuário responsável pela ação. C – Se o sistema está lento, uma possibilidade é que a causa seja o banco de dados. Nesse caso, o slow query log mostrará as consultas SQL mais lentas, permitindo conferir essa hipótese. Pergunta 10 Resposta Selecionada: e. Respostas: a. b. c. Considere a seguinte declaração: CREATE TRIGGER audita BEFORE INSERT ON produto FOR EACH ROW INSERT INTO produto_auditoria (data_hora_alteracao, usuario_que_inseriu, id_produto) VALUES (NOW(), CURRENT_USER(), OLD.id); Assinale a alternativa correta sobre os efeitos da execução da declaração. A trigger é criada, mas, quando for disparada, retornará um erro. A declaração resulta em um erro, e a trigger não é criada. A trigger é criada e funciona corretamente (preenche o id do produto). 0 em 1 pontos 23/09/2022 10:45 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_26789628_1&course_id=_190208_1&content_id=_8513… 19/19 Sexta-feira, 23 de Setembro de 2022 10h45min16s BRT d. e. Comentário da resposta: A trigger é criada, mas não funciona corretamente (o id do produto é preenchido com NULL). A trigger é criada, mas nunca será disparada. A trigger é criada, mas, quando for disparada, retornará um erro. A palavra OLD não é permitida em triggers para o comando INSERT. Quando se tenta criar uma trigger desse jeito, o MySQL retorna o seguinte erro: There is no OLD row in on INSERT trigger ← OK
Compartilhar