Simulado para o Exame 70-433 – MCTS: Microsoft SQL Server 2008 – Database Development – Parte 05

Boa Tarde Pessoal,

Dando continuidade aos testes para a prova 70-433, segue a parte 5 finalizando assim os itens cobrados em "Implementing Programming Objects" que é responsável por 16% desse exame.

Questão 038
Para testar o recurso de tratamento de erro (Try & Catch) do SQL Server, um dos programadores criou o seguinte script:

SET NOCOUNT ON;
BEGIN TRY
    PRINT
‘Início do bloco Try’;
    RAISERROR (‘Messagem de Teste – Bloco Try’,10,1);
    PRINT ‘Fim do bloco Try’;
END TRY
GO
BEGIN CATCH
    PRINT
‘Início do bloco Catch’;
    PRINT ERROR_MESSAGE();
    PRINT ‘Fim do bloco Catch’;
END CATCH

Qual será o retorno desse script ?

A. Ocorrerá um erro de sintaxe
B. Início do bloco Try
Início do bloco Catch
Messagem de Teste – Bloco Try
C. Fim do bloco Catch
Início do bloco Try
Messagem de Teste – Bloco Try
D. Início do bloco Try
Messagem de Teste – Bloco Try
Fim do bloco Try

Questão 039
Para testar o funcionamento da variável global @@error do SQL Server, um dos programadores criou o seguint script:

SET ARITHABORT ON
SET ANSI_WARNINGS ON

BEGIN
    DECLARE
@1 INT, @2 INT, @3 INT
    SET @1 = 1
    SET @2 = 0
    SET @3 = @1 / @2
    PRINT ‘Foi gerado um erro’
    PRINT ‘O número do erro é: ‘ + CAST(@@ERROR As VARCHAR(6))
END

Tendo em vista que erros que envolvam divisões por zero tem o código de erro 8184, qual será o retorno desse script ?

A. Msg 8134, Level 16, State 1, Line 5
Divide by zero error encountered.
Foi gerado um erro
O número do erro é: 8134
B. Msg 8134, Level 16, State 1, Line 5
Divide by zero error encountered.
Foi gerado um erro
O número do erro é: 0
C. Foi gerado um erro
O número do erro é: 8134
D. Foi gerado um erro
O número do erro é: 0

Questão 040
Dentro de um bloco TRY & CATCH, qual a melhor forma de obter a descrição de um erro ?

A. Capturar o número do erro no bloco CATCH e utilizar o número para consultar a view sys.messages em busca da descrição do erro
B. Utilizar a função ERROR_MESSAGE( )
C. Instanciar um objeto SqlException e utilizar a propriedade Message desse objeto
D. Não há como capturar a descrição de um erro dentro de um bloco CATCH

Questão 041
Qual a melhor maneira de alterar a severidade de uma mensagem personalizada (User Defined Message) ?

A. Utilizar a stored procedure sp_dropmessage
B. Utilizar a stored procedure sp_addmessage
C. Utilizar a stored procedure sp_altermessage
D. Eliminar a mensagem e recriá-la com o novo nível de severidade

Questão 042
Qual dos comandos abaixo são comandos válidos para implementar transações no SQL Server ? Marque todos que se aplicam.

A. BEGIN TRANSACTION
B. SAVE TRANSACTION
C. END TRANSACTION
D. START TRANSACTION
E. COMMIT TRANSACTION
F. CREATE TRANSACTION
G. ROLLBACK TRANSACTION

Questão 043
Você é o revisor de código de uma fábrica de software. Analisando as linhas de código de um determinado projeto, você localizou na camada de acesso a dados de um determinada determinada consulta:

SET XACT_ABORT ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
    UPDATE Fila SET Uso = 1 WHERE Modulo = ‘Contabilidade’
    SELECT * FROM FIN.LancamentosContabeis WITH (NOLOCK)
    UPDATE Fila SET Uso = 0 WHERE Modulo = ‘Contabilidade’
COMMIT

A. A tabela FIN.LancamentosContabeis ficará bloqueada para escrita até o fim da transação.
B. A tabela FIN.LancamentosContabeis ficará bloqueada para escrita enquanto durar o comando de SELECT.
C. A tabela FIN.LancamentosContabeis não ficará bloqueada.
D. O nível de isolamento SERIALIZABLE é o mais restrito e significa o oposto do HINT NOLOCK. A combinação de nível de isolamento com esse HINT provocará um erro.

Questão 044
Qual é o retorno do código abaixo ?

DECLARE @i INT
SET @i = 1

BEGIN TRAN T1
    SET @i += @@TRANCOUNT
    BEGIN TRAN T2
        SET @i += @@TRANCOUNT
    COMMIT
    BEGIN TRAN T3
        SET @i += @@TRANCOUNT
    COMMIT
ROLLBACK

SELECT @i

A. 1
B. 2
C. 3
D. 4
E. 5
F. 6

Questão 045
Um desenvolvedor estava testando operações em um contexto transacional e utilizou o seguinte script:

DECLARE @Pessoas TABLE (ID INT, NOME VARCHAR(20))

BEGIN TRAN

INSERT INTO @Pessoas VALUES (1, ‘Gabriela’)
INSERT INTO @Pessoas VALUES (2, ‘Fabiana’)
INSERT INTO @Pessoas VALUES (3, ‘Renata’)

ROLLBACK

Quantos registros existirão em @Pessoas após a execução do script ?

A. 0
B. 1
C. 2
D. 3

Respostas

Questão 038
Para testar o recurso de tratamento de erro (Try & Catch) do SQL Server, um dos programadores criou o seguinte script:

SET NOCOUNT ON;
BEGIN TRY
    PRINT
‘Início do bloco Try’;
    RAISERROR (‘Messagem de Teste – Bloco Try’,10,1);
    PRINT ‘Fim do bloco Try’;
END TRY
GO
BEGIN CATCH
    PRINT
‘Início do bloco Catch’;
    PRINT ERROR_MESSAGE();
    PRINT ‘Fim do bloco Catch’;
END CATCH

Qual será o retorno desse script ?

A. Ocorrerá um erro de sintaxe
B. Início do bloco Try
Início do bloco Catch
Messagem de Teste – Bloco Try
C. Fim do bloco Catch
Início do bloco Try
Messagem de Teste – Bloco Try
D. Início do bloco Try
Messagem de Teste – Bloco Try
Fim do bloco Try

Resposta Correta: A

A construção de um bloco Try & Catch exige que não haja nenhum comando entre o bloco TRY e o bloco CATCH. Como o delimitador GO está entre esses blocos um erro de sintaxe será gerado

Respostas Incorretas: B, C, D

B, C, D – Nenhum dos retornos estará correto, pois, o comando não será executado. Na hipótese do delimitador GO ser retirado do script, a alternativa D estaria correta. Como a mensagem tem uma criticidade de nível 10, ela é considerada informativa e não irá disparar um erro nesse caso executando todos os comandos dentro do bloco TRY.

Questão 039
Para testar o funcionamento da variável global @@error do SQL Server, um dos programadores criou o seguint script:

SET ARITHABORT ON
SET ANSI_WARNINGS ON

BEGIN
    DECLARE
@1 INT, @2 INT, @3 INT
    SET @1 = 1
    SET @2 = 0
    SET @3 = @1 / @2
    PRINT ‘Foi gerado um erro’
    PRINT ‘O número do erro é: ‘ + CAST(@@ERROR As VARCHAR(6))
END

Tendo em vista que erros que envolvam divisões por zero tem o código de erro 8184, qual será o retorno desse script ?

A. Msg 8134, Level 16, State 1, Line 5
Divide by zero error encountered.
Foi gerado um erro
O número do erro é: 8134
B. Msg 8134, Level 16, State 1, Line 5
Divide by zero error encountered.
Foi gerado um erro
O número do erro é: 0
C. Foi gerado um erro
O número do erro é: 8134
D. Foi gerado um erro
O número do erro é: 0

Resposta Correta: B

Explicação: A variável @@error retorna o código do erro da instrução imediatamente superior. A divisão da variável @1 pela variável @2 provocará um erro de divisão por zero (8134), mas como existe uma instrução de PRINT logo em seguida precedendo a instrução que usa a variável @@error e essa instrução é executada com sucesso o valor da variável @@error será zerado. Esse é um dos efeitos adversos mais comuns relacionados à utilização da variável @@error. Para evitá-lo normalmente utiliza-se múltiplas verificações com o @@error ou utiliza-se variáveis para acumulá-lo.

Respostas Incorretas: A, C, D

A – Embora a divisão por zero provoque o erro 8134, a variável @@error fará referência a última instrução executada. A instrução de PRINT não provoca erros, por isso o valor de @@error será igual a zero e não igual a 8134.

C, D – A mensagem de erro de divisão por zero só irá desaparecer se o erro for tratado ou as opções SET ARITHABORT e SET ANSI_WARNINGS estiverem marcadas como OFF.

Questão 040
Dentro de um bloco TRY & CATCH, qual a melhor forma de obter a descrição de um erro ?

A. Capturar o número do erro no bloco CATCH e utilizar o número para consultar a view sys.messages em busca da descrição do erro
B. Utilizar a função ERROR_MESSAGE( )
C. Instanciar um objeto SqlException e utilizar a propriedade Message desse objeto
D. Não há como capturar a descrição de um erro dentro de um bloco CATCH

Resposta Correta: B

Explicação: A função ERROR_MESSAGE() é o meio mais direto para obter a descrição de um erro dentro de um bloco CATCH. Essa função retorna diretamente a mensagem de erro da forma como ele foi capturado.

Respostas Incorretas: A, C, D

A – Essa é uma alternativa possível, mas além de mais trabalhosa é um pouco limitada. As mensagens de erro na sys.messages mostram apenas um template do erro (ex: Invalid column name ‘%.*ls’.) e não a mensagem exata do erro.

C – O SQL Server não dispõe de um objeto SqlException.

D – A função ERROR_MESSAGE() permite capturar a descrição de um erro dentro de um bloco CATCH

Questão 041
Qual a melhor maneira de alterar a severidade de uma mensagem personalizada (User Defined Message) ?

A. Utilizar a stored procedure sp_dropmessage
B. Utilizar a stored procedure sp_addmessage
C. Utilizar a stored procedure sp_altermessage
D. Eliminar a mensagem e recriá-la com o novo nível de severidade

Resposta Certa: B

Explicação: A severidade de uma mensagem pode ser alterada através da stored procedure sp_addmessage com o parâmetro REPLACE. Esse parâmetro permite que a substituição do texto da mensagem e da sua severidade. A alteração da severidade de uma messagem terá efeito para todos outros idiomas que tenham o mesmo Message ID.

Respostas Incorretas: A, C, D

A – A stored procedure sp_dropmessage é capaz de excluir uma mensagem personalizada, mas não é capaz de alterar sua severidade

C – A stored procedure sp_altermessage pode alterar apenas a capacidade de uma mensagem logar ou não sua ocorrência no log de aplicação do Windows. Embora seja sugestivo, essa stored procedure não possibilita alterar a prioridade de uma mensagem.

D – Essa alternativa é uma possibilidade, mas envolverá mais passos que a utilização da stored procedure sp_addmessage.

Questão 042
Qual dos comandos abaixo são comandos válidos para implementar transações no SQL Server ? Marque todos que se aplicam.

A. BEGIN TRANSACTION
B. SAVE TRANSACTION
C. END TRANSACTION
D. START TRANSACTION
E. COMMIT TRANSACTION
F. CREATE TRANSACTION
G. ROLLBACK TRANSACTION

Respostas Corretas: A, B, D, G

Explicação: Os comandos BEGIN TRANSACTION, SAVE TRANSACTION, COMMIT TRANSACTION e ROLLBACK TRANSACTION são os quatro commandos utilizados para implementar transações no SQL Server. O comando BEGIN TRANSACTION inicia uma transação explicitamente, o comando COMMIT torna os efeitos da transação permanente, o comando ROLLBACK desfaz os efeitos da transação e o comando SAVE TRANSACTION faz uma marcação (SAVEPOINT) que possibilita a execução de um ROLLBACK de parte dos efeitos da transação.

Respostas Incorretas: C, D, F

C, D, F – Nenhum desses comandos existe no SQL Server

Questão 043
Você é o revisor de código de uma fábrica de software. Analisando as linhas de código de um determinado projeto, você localizou na camada de acesso a dados de um determinada determinada consulta:

SET XACT_ABORT ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
    UPDATE Fila SET Uso = 1 WHERE Modulo = ‘Contabilidade’
    SELECT * FROM FIN.LancamentosContabeis WITH (NOLOCK)
    UPDATE Fila SET Uso = 0 WHERE Modulo = ‘Contabilidade’
COMMIT

A. A tabela FIN.LancamentosContabeis ficará bloqueada para escrita até o fim da transação.
B. A tabela FIN.LancamentosContabeis ficará bloqueada para escrita enquanto durar o comando de SELECT.
C. A tabela FIN.LancamentosContabeis não ficará bloqueada.
D. O nível de isolamento SERIALIZABLE é o mais restrito e significa o oposto do HINT NOLOCK. A combinação de nível de isolamento com esse HINT provocará um erro.

Resposta Correta: C

A cláusula SET TRANSACTION ISOLATION LEVEL impõe um nível de isolamento para a sessão. Ainda que a sessão esteja utilizando um dos níveis de isolamento mais restritivos que normalmente impõe bloqueios, a presença do HINT NOLOCK fará com que os bloqueios não sejam impostos já que um HINT em um comando tem precedência sobre a configuração de nível de isolamento por sessão.

Respostas Incorretas: A, B, D

A – O nível de isolamento SERIALIZABLE (e o REPEATABLE READ) poderiam bloquear a tabela FIN.LancamentosContabeis até o fim da transação, mas o uso de HINTs de bloqueio sobrepõe as opções de nível de isolamento para o comando que utilizar o HINT. Como o HINT utilizado é o NOLOCK, não haverá bloqueio mesmo com o nível de isolamento SERIALIZABLE.

B – O nível de isolamento padrão (READ COMMITED) impõe bloqueios apenas durante a execução do comando (no caso de comandos de leitura). Os nível de isolamento SERIALIZABLE é mais restritivo e impõe o bloqueio até que a transação seja finalizada. Como o HINT NOLOCK está sendo utilizado, não haverá bloqueios independente do tempo de duração do comando de SELECT.

D – A combinação de níveis de isolamento e HINTs não provoca erros. O uso em conjunto é indicado para situações em que um comando específico deva diferir do nível de isolamento escolhido. É preferível colocar um HINT em um único comando (ainda que em divergência do nível de isolamento) a especificar um HINT para comando de forma a escolher o nível de isolamento pretendido.

Questão 044
Qual é o retorno do código abaixo ?

DECLARE @i INT
SET @i = 1

BEGIN TRAN T1
    SET @i += @@TRANCOUNT
    BEGIN TRAN T2
        SET @i += @@TRANCOUNT
    COMMIT
    BEGIN TRAN T3
        SET @i += @@TRANCOUNT
    COMMIT
ROLLBACK

SELECT @i

A. 1
B. 2
C. 3
D. 4
E. 5
F. 6

Resposta Correta: F

Explicação: A variável global @@trancount retorna a quantidade de transações abertas por uma determinada conexão. No início do script, a variável @i tinha o valor igual a 1. Após a abertura da transação T1, a variável @i foi incrementada do valor de @@trancount. Como havia uma transação aberta, @i ficou igual a 2. Após a abertura da transação T2, o valor de @@trancount era 2, pois, T1 e T2 estavam abertas. Se o valor de @i era 2, ao ser incrementada por @@trancount, @i ficou com o valor de 4. Quando ocorreu o COMMIT da transação T2, o valor de @@trancount foi reduzido para 1, mas a abertura da transação T3, incrementou esse valor novamente para 2. Se o valor de @i era 4, com o incremento de @@trancount, @i ficou com o valor de 6.

Respostas Incorretas: A, B, C, D, E

A, B, C, D, E – Nenhuma dessa alternativas mostra o retorno correto da variável @i.

Questão 045
Um desenvolvedor estava testando operações em um contexto transacional e utilizou o seguinte script:

DECLARE @Pessoas TABLE (ID INT, NOME VARCHAR(20))

BEGIN TRAN

INSERT INTO @Pessoas VALUES (1, ‘Gabriela’)
INSERT INTO @Pessoas VALUES (2, ‘Fabiana’)
INSERT INTO @Pessoas VALUES (3, ‘Renata’)

ROLLBACK

Quantos registros existirão em @Pessoas após a execução do script ?

A. 0
B. 1
C. 2
D. 3

Resposta Correta: D

Explicação: Uma variável não participa de um contexto transacional. Mesmo variáveis do tipo TABLE são indiferentes a uma transação e por isso as instruções de INSERT não serão revertidas.

Respostas Incorretas: A, B, C

A – Como tabelas do tipo TABLE são indiferentes a uma transação, o comando de ROLLBACK não funcionará de forma que os efeitos da transação não serão desfeitos.

B, C – Não há como haver apenas um ou dois registros em @Pessoas visto que foram três transações de INSERT

[ ]s,

Gustavo

8 Respostas para “Simulado para o Exame 70-433 – MCTS: Microsoft SQL Server 2008 – Database Development – Parte 05

  1. Luís Flávio

    Muito bom!

  2. Valeu Luís :)

  3. Adorei a sua iniciativa!!!É bom ter uma perspectiva do que nos espera na prova!!Renata

  4. Pingback: Materiais de Estudo | Luiz Phellipe

  5. Bruno Moreira dos Santos

    Gustavo corrige a questão 42 que eu acredito que esteja errada.

    O correto não seria assim:

    ALTERNATIVAS CORRETAS:
    A,B,E,G

    ALTERNATIVAS INCORRETAS:
    C,D,F

    Grande abraço até mais!!!

  6. Gustavo onde posso encontrar os posts anteriores do simulado?

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s