Baixe o app para aproveitar ainda mais
Prévia do material em texto
20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 1/18 Usuário RAFAEL MOREIRA CHAVES Curso 2103-PROGRAMAÇÃO DE BANCO DE DADOS Teste Clique aqui para iniciar o Quiz Iniciado 27/08/21 15:48 Enviado 20/09/21 12:24 Data de vencimento 20/09/21 23:59 Status Completada Resultado da tentativa 5 em 10 pontos Tempo decorrido 572 horas, 36 minutos Resultados exibidos Todas as respostas, Respostas enviadas, Respostas corretas, Comentários Pergunta 1 Resposta Selecionada: a. Respostas: a. b. c. Considere a seguinte sequência de comandos: 1. DELIMITER $$ 2. CREATE PROCEDURE intervalo_aleatorio(IN tamanho int, OUT inicio int, OUT fim int) 3. BEGIN 4. SET inicio = ROUND(RAND()*100); 5. SET fim = inicio + tamanho; 6. END$$ 7. DELIMITER ; 8. CALL intervalo_aleatorio(10, @ini, @fim); 9. SELECT @ini, @fim; Sobre a sequência de comandos, é correto afirmar: A criação da procedure retornará um erro, pois a linha 4 deveria ser: SELECT ROUND(RAND()*100) INTO inicio; A criação da procedure retornará um erro, pois a linha 4 deveria ser: SELECT ROUND(RAND()*100) INTO inicio; Todos os comandos serão executados com sucesso, e uma possível saída é: +------+------+ | @ini | @fim | +------+------+ | 46 | 56 | +------+------+ 0 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 2/18 d. e. Comentário da resposta: O comando CALL retornará um erro, pois o nome do argumento (ini) não bate com o nome do parâmetro (inicio). O comando SELECT retornará um erro, pois os arrobas devem preceder os nomes das variáveis somente na chamada do procedimento (CALL). Todos os comandos serão executados com sucesso, e uma possível saída é: +--------+--------+ | @ini | @fim | +--------+--------+ | 0.46 | 0.56 | +--------+--------+ A alternativa B é a correta, pois apresenta uma saída plausível para a execução dos comandos apresentados. O procedimento intervalo_aleatorio deve preencher a variável @ini com um valor entre 0 e 100, no caso foi 46. O procedimento intervalo_aleatorio deve preencher a variável @fim com o valor de @ini acrescido do valor do argumento tamanho. Ou seja, para @ini 46 e tamanho 10 (linha 8), @fim deve ser 46 + 10 = 56. O SELECT INTO somente é necessário quando se quer passar o resultado de um SELECT para uma variável. Não é o caso, por isso a alternativa A está errada. O nome do argumento não precisa bater com o nome do parâmetro. A correspondência é feita pela posição do argumento na lista de argumentos. Por isso, a alternativa C está errada. Os arrobas foram adequadamente utilizados na sequência de comandos. Por isso, a alternativa D está errada. A expressão ROUND(RAND()*100) retorna sempre um número inteiro entre 0 e 100, então não há como o valor de ini e fim serem fracionários. Por isso, a alternativa E está errada. Pergunta 2 Considere o cenário da questão 7. Um programador escreveu a seguinte função para atualizar o campo pontuacao da tabela campeonato: DELIMITER $$ CREATE FUNCTION atualiza_pontuacao(id_do_time int) RETURNS int deterministic BEGIN DECLARE pontuacao_como_time1, pontuacao_como_time2, pts int; 0 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 3/18 Resposta Selecionada: c. Respostas: a. b. c. d. e. 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á 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. 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. 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. 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 4/18 Comentário da resposta: 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 3 Resposta Selecionada: d. Respostas: a. Considere a seguinte tabela login: +------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+-------+ | data_hora | datetime | YES | | NULL | | | id_cliente | int | YES | | NULL | | +------------+----------+------+-----+---------+-------+ Considere agora o comando: SELECT HOUR(data_hora) as hora, id_cliente FROM login GROUP BY hora; Qual o problema com o comando acima? O alias hora não funciona no GROUP BY; seria preciso escrever GROUP BY HOUR(data_hora). Há um erro de sintaxe. 0 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 5/18 b. c. d. e. Comentário da resposta: HOUR não pode ser usada com o GROUPY BY, pois não é uma função agregadora. A seleção da coluna id_cliente é incompatível com o agrupamento por hora, já que é um valor que varia dentro de um mesmo grupo. O alias hora não funciona no GROUP BY; seria preciso escrever GROUP BY HOUR(data_hora). Não há nenhum problema com o comando. Em uma seleção com agrupamento, os campos selecionados devem ou fazer parte da definição do agrupamento ou serem funções que agregam cada grupo. Não é o caso de seleção de id_cliente. O comando produz a seguinte saída: ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'brasil.login.id_cliente'which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by Pergunta 4 Considere as seguintes tabelas pet e dono: > describe pet; +---------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | nome | varchar(20) | NO | UNI | NULL | | | id_dono | int | YES | | NULL | | +---------+-------------+------+-----+---------+----------------+ > describe dono; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ 1 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 6/18 Resposta Selecionada: a. Respostas: a. b. c. d. | id | int | NO | PRI | NULL | auto_increment | | nome | varchar(20) | NO | UNI | NULL | | +-------+-------------+------+-----+---------+----------------+ Considere agora a seguinte sequência de comandos: > insert into dono (nome) values ('Leonardo'); > insert into pet (nome) values ('Brasinha'); > GET DIAGNOSTICS CONDITION 1 @msg = MESSAGE_TEXT; > SELECT @msg; Sobre o resultado dessa sequência de comandos, considere as seguintes afirmações: I – Se Leonardo for um dono já existente, a variável @msg terá o valor"Duplicate entry 'Leonardo' for key 'dono.nome'". II – Se Brasinha for um pet já existente, a variável @msg terá o valor "Duplicate entry 'Brasinha' for key 'pet.nome'". Assinale a alternativa verdadeira. Somente a afirmação II está correta, uma vez que o comando GET DIAGNOSTICS só recupera os detalhes do erro ocorrido na linha imediatamente anterior. Somente a afirmação II está correta, uma vez que o comando GET DIAGNOSTICS só recupera os detalhes do erro ocorrido na linha imediatamente anterior. Ambas as afirmações estão incorretas, uma vez que o comando GET DIAGNOSTICS foi utilizado sem um handler. Somente a afirmação II está correta, uma vez que o comando GET DIAGNOSTICS só recupera os detalhes do primeiro erro ocorrido ainda não tratado. Ambas as afirmações estão corretas, uma vez que o comando GET DIAGNOSTICS recupera os detalhes do último erro ocorrido. Obs.: no caso de o pet e o dono forem repetidos, a mensagem fará menção ao último erro; no caso, o erro do pet. 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 7/18 e. Comentário da resposta: Ambas as afirmações estão incorretas, devido a erros de sintaxe nos comandos. Somente a afirmação II está correta, pois o comando GET DIAGNOSTICSsó recupera os detalhes do erro ocorrido na linha imediatamente anterior. Pergunta 5 Considere os seguintes procedimentos: DELIMITER $$ CREATE PROCEDURE proc1(IN x int) BEGIN TRUNCATE tab1; TRUNCATE tab2; TRUNCATE tab3; IF x > 100 THEN INSERT INTO tab1 (valor) VALUES (RAND()); END IF; IF x > 10 THEN INSERT INTO tab1 (valor) VALUES (RAND()); INSERT INTO tab2 (valor) VALUES (RAND()); END IF; IF x > 0 THEN INSERT INTO tab2 (valor) VALUES (RAND()); ELSE INSERT INTO tab3 (valor) VALUES (RAND()); END IF; END$$ DELIMITER ; DELIMITER $$ CREATE PROCEDURE proc2(IN x int) 1 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 8/18 Resposta Selecionada: a. Respostas: a. b. c. d. A quantidade de registros em tab1 após a execução de proc1(x) é a mesma quantidade de registros em tab1 após a execução de proc2(x). A quantidade de registros em tab2 após a execução de proc1(x) é a mesma quantidade de registros em tab2 após a execução de proc2(x). A quantidade de registros em tab3 após a execução de proc1(x) é a mesma quantidade de registros em tab3 após a execução de proc2(x). BEGIN TRUNCATE tab1; TRUNCATE tab2; TRUNCATE tab3; IF x > 100 THEN INSERT INTO tab1 (valor) VALUES (RAND()); ELSEIF x > 10 THEN INSERT INTO tab1 (valor) VALUES (RAND()); INSERT INTO tab2 (valor) VALUES (RAND()); ELSEIF x > 0 THEN INSERT INTO tab2 (valor) VALUES (RAND()); ELSE INSERT INTO tab3 (valor) VALUES (RAND()); END IF; END$$ DELIMITER ; Assinale a alternativa que contenha apenas valores de x que satisfaçam todas as seguintes condições: 0,10,100, 101 0,10,100, 101 0, 10, 100 0, 101 0, 10 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_id… 9/18 e. Comentário da resposta: 10, 100 Seguem as quantidades de registros em cada tabela após cada uma das execuções consideradas: call proc1(0); tab1 – 0 tab2 – 0 tab3 – 1 call proc1(10); tab1 – 0 tab2 – 1 tab3 – 0 call proc1(100); tab1 – 1 tab2 – 2 tab3 – 0 call proc1(101); tab1 – 2 tab2 – 2 tab3 – 0 call proc2(0); tab1 – 0 tab2 – 0 tab3 – 1 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 10/18 call proc2(10); tab1 – 0 tab2 – 1 tab3 – 0 call proc2(100); tab1 – 1 tab2 – 1 tab3 – 0 call proc2(101); tab1 – 1 tab2 – 0 tab3 – 0 Pergunta 6 Considere o seguinte procedimento: DELIMITER $$ CREATE PROCEDURE insere_usuarios(IN quantidade int) BEGIN DECLARE i INT DEFAULT 1; WHILE i <= quantidade DO INSERT INTO usuario (nome) VALUES (CONCAT('Usuário ', i)); IF i < 10 THEN SET i = i + 1; END IF; END WHILE; END$$ 0 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 11/18 Resposta Selecionada: b. Respostas: a. b. c. d. e. Comentário da resposta: Execução 1: Execução 2: DELIMITER ; Considere agora as seguintes execuções do procedimento acima: CALL insere_usuarios(9); CALL insere_usuarios(10); Considere agora as seguintes afirmações: (I) A execução 1 insere 9 registros na tabela. (II) As execuções 1 e 2 continuarão em execução para sempre ou até serem interrompidas ou até exaurirem os recursos do sistema. (III) A execução 2 continuará em execução para sempre ou até ser interrompida ou até exaurir os recursos do sistema. Isto pode ocasionar a inserção de mais de 10 registros na tabela usuário. (IV) A execução 2 continuará em execução para sempre ou até ser interrompida ou até exaurir os recursos do sistema. Nessa situação, como o fim do procedimento não é atingido, nenhum registro é de fato inserido na tabela. Assinale a alternativa que contenha todas as afirmações verdadeiras. II; III. II; IV. II; III. I. I; IV. I; III. A execução 1 insere exatamente 9 registros e nunca entrará em loop infinito. A execução 2 entra em loop infinito. Se for disparada fora do contexto de uma transação, cada INSERT insere um registro na tabela, e os registros vão sendo inseridos até que a execução seja interrompida ou que os recursos do sistema sejam exauridos. Pergunta7 Considere a seguinte sequência de comandos: 1 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 12/18 Resposta Selecionada: c. Respostas: a. b. c. d. e. Comentário da resposta: SET @chave = UNHEX(SHA2('%s', 512)); SELECT AES_DECRYPT(sigiloso, @chave) as descriptografado FROM dados; Considere agora as seguintes afirmações: I – A sequência de comandos realiza a desencriptação da coluna sigiloso da tabela dados; a chave utilizada é uma chave privada, que deve ser correspondente à chave pública usada na função AES_ENCRYPT, que criptografou os dados. II – A sequência de comandos realiza a desencriptação da coluna sigiloso da tabela dados; a chave utilizada é uma chave simétrica, que deve ser igual à chave usada na função AES_ENCRYPT, que criptografou os dados. III – SHA e AES são padrões criptográficos bem estabelecidos, utilizados mundialmente e disponíveis em uma ampla gama de ambientes, não somente nos bancos de dados. IV – O valor passado para a função SHA2, para a criação da chave, deve ser a senha do usuário. Assinale a alternativa que indica as afirmações verdadeiras. II e III. II, III e IV. I e III. II e III. I, III e IV. II e IV. SHA é um padrão de função hash, que nos ajuda a gerar uma chave simétrica a par�r de um certo segredo, que não tem relação nenhuma com a senha do usuário. Já o AES é um padrão criptográfico de chave simétrica, o que significa que a mesma chave u�lizada para criptografar os dados é a chave u�lizada para desencriptá-los. Assim, as afirmações verdadeiras são a II e a III. Pergunta 8 Encoders e decoders básicos A tabela abaixo mostra diferentes caracteres com seus code points em Unicode e os bytes (usando notação hexadecimal) correspondentes em diferentes charsets (asteriscos indicam que o caractere não pode ser representado naquele charset). Note que alguns charsets possuem comprimento variável. Char Code point ascii gb2312 utf-8 1 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 13/18 A U+0041 41 41 41 á U+00E1 * A8 A2 C3 A1 气 U+6C14 * C6 F8 E6 B0 94 U+1D11E * F0 9D 84 9E 34 D8 1E DD Todos esses asteriscos deixam claro que alguns charsets, como o ASCII, não representam todos os caracteres Unicode. Os charsets UTF, contudo, são projetados para tratar de todos os code points do Unicode. gb2312 – padrão legado para codificar ideogramas de chinês simplificado. utf-8 – O charset de 8 bits mais comum na web, retrocompatível com ASCII puro (texto em ASCII puro é válido no UTF-8). (Fonte: RAMALHO, Luciano. Text versus bytes. In: Fluent Python: clear, concise, and effective programming. Sebastopol: O’Reilly Media, 2015.) Para complementar o texto anterior, Unicode é um padrão que atribui um código (code point) a cada caractere existente. Por fim, considere a seguinte sequência de comandos: 1 > CREATE TABLE tab (info blob); 2 > INSERT INTO tab (info) VALUES ('O mundo é bão Sebastião'); 3 > table tab; +---------------------------+ | info | +---------------------------+ | O mundo é bão Sebastião | +---------------------------+ 4 > SELECT CONVERT(info USING utf8) as decodificando_com_utf8 FROM tab; +----------------------------+ | decodificando_com_utf8 | +----------------------------+ | O mundo é bão Sebastião | +----------------------------+ 5 > SELECT CONVERT(info USING ascii) as decodificando_com_ascii FROM tab; +----------------------------+ 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 14/18 Resposta Selecionada: c. Respostas: a. b. c. d. e. | decodificando_com_ascii | +----------------------------+ | O mundo ?? b??o Sebasti??o | +----------------------------+ Considerando o texto fornecido e o estudado no capítulo 7, assinale a alternativa que melhor explica os resultados obtidos na sequência de comandos. O texto “O mundo é bom Sebas�ão” é armazenado em uma coluna do �po blob (sem charset definido). Mas, ainda assim, o charset u�lizado é o UTF-8, devido à configuração da variável de ambiente LANG. Na hora de ler a tabela sem especificar um charset (comando 3), a leitura produz um resultado legível, pois a leitura u�liza o charset padrão. A leitura u�lizando o charset UTF-8 (comando 4) produz um resultado legível. Por fim, ao decodificar os bytes armazenados u�lizando o charset ASCII (comando 5), temos um resultado não totalmente legível. O texto “O mundo é bão Sebas�ão” é armazenado u�lizando o charset UTF-8 (único suportado pelo MySQL). Como os bytes foram produzidos com charset UTF- 8, a leitura u�lizando esse charset (comandos 3 e 4) produz um resultado legível. Por fim, ao decodificar os bytes armazenados u�lizando o charset ASCII (comando 5), temos um resultado não totalmente legível, pois o charset UTF-8 é retrocompa�vel com ASCII puro. O texto “O mundo é bão Sebas�ão” é armazenado em uma coluna do �po blob (caracteres Unicode). Por isso, na hora de ler a tabela sem especificar um charset (comando 3), temos um resultado legível. Como os bytes foram produzidos com charset UTF-8, a leitura u�lizando esse charset (comando 4) produz um resultado legível. Por fim, ao decodificar os bytes armazenados u�lizando o charset ASCII (comando 5), temos um resultado não totalmente legível, pois o charset UTF-8 é retrocompa�vel com ASCII puro. O texto “O mundo é bom Sebas�ão” é armazenado em uma coluna do �po blob (sem charset definido). Mas, ainda assim, o charset u�lizado é o UTF-8, devido à configuração da variável de ambiente LANG. Na hora de ler a tabela sem especificar um charset (comando 3), a leitura produz um resultado legível, pois a leitura u�liza o charset padrão. A leitura u�lizando o charset UTF-8 (comando 4) produz um resultado legível. Por fim, ao decodificar os bytes armazenados u�lizando o charset ASCII (comando 5), temos um resultado não totalmente legível. O texto “O mundo é bão Sebas�ão” é armazenado em uma coluna do �po blob (sem charset), mas, ainda assim, o charset u�lizado é o ASCII, devido à configuração da variável de ambiente LANG. Como os bytes foram produzidos com charset ASCII, a leitura u�lizando esse charset (comandos 3 e 4) produz um resultado legível, uma vez que o UTF-8 é retrocompa�vel com ASCII puro. Por fim, ao decodificar os bytes armazenados u�lizando o charset ASCII, temos um resultado não totalmente legível, também pelo fato de o UTF-8 ser retrocompa�vel com ASCII puro. 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 15/18 Comentário da resposta: O texto “O mundo é bão Sebas�ão” é armazenado em uma coluna do �po blob (sem charset), mas, ainda assim, o charset u�lizado é o UTF-8, devido à configuração da variável de ambiente LANG. Na hora de ler a tabela sem especificar um charset (comando 3), a leitura produz um resultado legível, pois a leitura também u�liza o charset padrão. Como os bytes foram produzidos com charset UTF-8, a leitura u�lizando esse charset (comando 4) produz um resultado legível. Por fim, ao decodificar os bytes armazenados u�lizando o charset ASCII, temos um resultado não totalmente legível devido a um erro de sintaxe no comando. Pelo texto de apoio, vemos que o charset ASCII é incapaz de lidar com textos acentuados. Portanto, é possível determinar, pelos comandos 2 e 3, que o ASCII não é o charset u�lizado na escrita nos dados. O fato de o UTF-8 ser retrocompa�velcom o ASCII significa que qualquer coisa escrita com ASCII consegue ser lida com o UTF-8, mas não é o que faz a escrita em UTF-8 não ser legível no ASCII. Pelo texto do capítulo 7, também sabemos que o MySQL é capaz de lidar com diferente charsets. Com esses raciocínios, é possível determinar a alterna�va “c” como correta em detrimento das outras. Pergunta 9 Considere a tabela produto criada com o seguinte comando: create table produto (id int auto_increment, descricao text, preco double, primary key (id)); Considere também a seguinte trigger associada à tabela produto: CREATE TRIGGER audita AFTER UPDATE ON produto FOR EACH ROW INSERT INTO produto_auditoria (data_hora_alteracao, usuario_que_inseriu, id_produto) VALUES (NOW(), CURRENT_USER(), OLD.id); Por fim, considere as seguintes sequências de comandos (obs.: uma sequência pode ter um só comando): I INSERT INTO produto (descricao, preco) VALUES ('Copo americano', 10); II DELETE FROM produto WHERE id = 1; III REPLACE INTO produto VALUES (100, 'Vaso chinês', 1000); REPLACE INTO produto VALUES (100, 'Vaso chinês', 2000); 1 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 16/18 Resposta Selecionada: b. Respostas: a. b. c. d. e. Comentário da resposta: IV INSERT INTO produto VALUES (200, 'Cumbuca japonesa', 50) ON DUPLICATE KEY UPDATE descricao = 'Cumbuca japonesa', preco=50; INSERT INTO produto VALUES (200, 'Cumbuca japonesa', 70) ON DUPLICATE KEY UPDATE descricao = 'Cumbuca japonesa', preco=70; V UPDATE produto SET descricao = 'Cumbuca japonesa', preco=70 WHERE id = 200; Assinale a alternativa correta. As sequências IV e V disparam a trigger. As sequências I, II, III, IV e V disparam a trigger. As sequências IV e V disparam a trigger. As sequências III, IV e V disparam a trigger. Apenas a sequência V dispara a trigger. Nenhuma das sequências dispara a trigger. A trigger é disparada apenas pelo comando UPDATE, o que ocorre diretamente na sequência V e condicionalmente na sequência IV. A sequência III, apesar de efetuar uma atualização, não dispara a trigger por não realizar um UPDATE. Portanto, a alterna�va “b” é a correta. Pergunta 10 Considere a seguinte tabela usuario e sua tabela de auditoriausuario_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 | | 0 em 1 pontos 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 17/18 Resposta Selecionada: e. Respostas: a. b. c. d. e. Comentário da resposta: | nome_antes | text | YES | | NULL | | | 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. Somente a versão 1 está correta. 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. 20/09/2021 21:37 Revisar envio do teste: Clique aqui para iniciar o Quiz &ndash... https://senacsp.blackboard.com/webapps/assessment/review/review.jsp?attempt_id=_20723945_1&course_id=_163573_1&content_id=_7241934_1&outcome_i… 18/18 Exemplo: insert into usuario (nome, papel) values ('joao', 'operario'); Já a versão 2 (AFTER) funciona corretamente.
Compartilhar