Buscar

Quiz Programação de Banco de Dados - Senac

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

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

Outros materiais