Arquivo da categoria: Material

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

Olá Pessoal,

Dando continuidade ao tópico "Working with Query Fundamentals", apresento as questões de atualização de dados com instruções DML (INSERT, UPDATE e DELETE) e a cláusula OUTPUT.

Questão 055
Como uma atividade rotineira de expurgo, você possui uma tabela com 50 milhões de linhas e precisa excluir o conteúdo dessa tabela gerando o mínimo de overhead para o log de transações e bloqueios para a aplicação. Os itens abaixo devem ser levados em consideração:

  • O comando deve ficar dentro de uma transação
  • A tabela possui uma chave primária composta de três colunas
  • A tabela não está envolvida em nenhum tipo de relacionamento

Qual seria o comando mais adequado para efetuar a exclusão dos registros ?

A. DELETE
B. TRUNCATE TABLE
C. DROP TABLE
D. DBCC REINDEX(‘Tabela’)

Questão 056
Você está desenvolvendo uma aplicação de controle de ponto e necessita em um único comando inserir vários registros referente a entrada e saída de funcionários em uma tabela específica chamada Marcacoes.

Matricula Data Hora Tipo
500163 23/11/2010 09:15 Entrada
500163 23/11/2010 12:18 Saída
500163 23/11/2010 14:05 Entrada
500163 23/11/2010 19:23 Saída

Qual seria a melhor forma de desenvolver essa tarefa ?

A. Utilizar o comando INSERT com múltiplos valores
B. Criar um SET de dados com o uso do VALUES e efetuar um INSERT com SELECT
C. Efetuar um INSERT com um SELECT especificando o SET de dados
D. Não é possível inserir múltiplos valores com um único comando de INSERT. Será necessário efetuar um INSERT para cada registro desejado

Questão 057
Você está efetuando uma manutenção em aplicação de liberação de acesso às dependências do prédio da sua empresa. Como parte do processo de segurança predial, todas as pessoas que têm registros de entrada no prédio a mais de três meses, devem ser excluídas do cadastro para que sua próxima visita force um recadastro. A figura abaixo mostra as tabelas necessárias para efetuar essa manutenção (o relacionamento entre elas não é obrigatório):

Quais dos comandos abaixo é válido para essa tarefa ?

A. DELETE FROM Pessoas FROM Pessoas As P
INNER JOIN Marcacoes As M ON P.RG = M.RG
WHERE M.Data <= DateAdd(MM,-3,GETDATE())

DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE())

B. DELETE FROM (Pessoas
INNER JOIN Marcacoes As M ON P.RG = M.RG)
WHERE M.Data <= DateAdd(MM,-3,GETDATE ())

DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE())

C. DELETE Pessoas.*
FROM Pessoas As P
INNER JOIN Marcacoes As M ON P.RG = M.RG
WHERE M.Data <= DateAdd(MM,-3,GETDATE ())

DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE())

D. Todas as combinações são válidas

Questão 058
Um desenvolvedor montou o script abaixo:

SET ANSI_NULL_DFLT_ON OFF

CREATE TABLE Lancamentos (
    IDLancamento INT IDENTITY(1,1),
    DataLancamento DATE DEFAULT GETDATE(),
    CentroCusto CHAR(3) DEFAULT ‘ADM’,
    ValorLancamento SMALLMONEY,
    CONSTRAINT
UQDataCentro UNIQUE (DataLancamento, CentroCusto))

INSERT INTO Lancamentos DEFAULT VALUES

Os dois primeiros comandos do script foram executados com êxito e o terceiro comando (o de INSERT) não foi executado. O que acontecerá se essa instrução de INSERT for executada múltiplas vezes com intervalos de 1 segundo em cada execução ?

A. Ocorrerá um erro de sintaxe em todas as execuções, pois, a sintaxe apresentada não é válida
B. Ocorrerá um erro de execução em todas as execuções
C. A primeira execução será bem sucedida e as execuções subsequentes irão falhar
D. Todas as execuções serão bem sucedidas

Questão 059
A empresa RFT Associados é uma empresa forte no ramo de comércio eletrônico. O banco de dados da RFT possui uma tabela central com a relação de produtos da empresa. Para evitar alterações nessa tabela durante o dia, as alterações são cadastras em uma tabela a parte para que ao final do dia, as alterações sejam efetivadas. As tabelas são exibidas na figura abaixo:

Todos os dias em um horário predeterminado, os registros na tabela "Produtos" devem ser atualizados conforme as alterações cadastradas na tabela ProdutosAlteracoes. Qual dos comandos abaixo atendem esse propósito ? Marque todos que se aplicam.

A.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM Produtos
INNER JOIN ProdutosAlteracoes ON Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

B.

UPDATE Produtos SET
    POld.Nome = PNew.Nome, POld.Valor = PNew.Valor,
    POld.Estoque = PNew.Estoque, POld.Descontinuado = PNew.Descontinuado
FROM Produtos As POld
INNER JOIN ProdutosAlteracoes As PNew ON POld.ProdutoID = PNew.ProdutoID

C.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM Produtos, ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

D.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

E.

UPDATE Produtos, ProdutosAlteracoes SET
    Produtos.Nome = ProdutosAlteracoes.Nome, Produtos.Valor = ProdutosAlteracoes.Valor,
    Produtos.Estoque = ProdutosAlteracoes.Estoque, Produtos.Descontinuado = ProdutosAlteracoes.Descontinuado
WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

F.

UPDATE Produtos INNER JOIN ProdutosAlteracoes
    ON Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID SET
    Produtos.Nome = ProdutosAlteracoes.Nome, Produtos.Valor = ProdutosAlteracoes.Valor,
    Produtos.Estoque = ProdutosAlteracoes.Estoque, Produtos.Descontinuado = ProdutosAlteracoes.Descontinuado

G.

UPDATE Produtos SET (Nome, Valor, Estoque, Descontinuado) = (
    SELECT Nome, Valor, Estoque, Descontinuado FROM ProdutosAlteracoes
    WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID)
WHERE EXISTS (SELECT 1 FROM ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID)

Questão 060
Em um determinado sistema de compras que você está efetuando manutenção, há uma tabela de pessoas e os respectivos pontos obtidos após as compras realizadas. Como forma de gratificar os primeiros cinco clientes mais antigos (menor ID), você deseja aumentar em 1000 pontos a pontuação atual.

ID Nome Pontos
01 Marcela 1051
02 Renata 2309
03 Tatiany 4233
04 Sabrina 3225
06 Roberta 1598
08 Amanda 1971
09 Gisele 1236
10 Juliana 5601
11 Julia 3300
12 Priscila 2437

Qual dos comandos abaixo pode fazer isso ?

A. UPDATE Clientes SET Pontos = Pontos + 1000 WHERE ID <= 5
B. UPDATE Clientes SET Pontos = 1000 WHERE ID <= 5
C. UPDATE TOP(5) Clientes SET Pontos = Pontos + 1000
D. Nenhuma das anteriores

Questão 061
Você possui uma tabela com os seguintes registros e colunas:

ID Nome Usuário de Rede
01 Marcela Gonçalves marcela.goncalves
02 Renata Maciel Costa renata.costa
03 Tatiany Santos Almeida — Não Identificado —
04 Sabrina Fernandes Moura — Não Identificado —
06 Roberta Lins Silva roberta.lins
08 Amanda Rodrigues Mendes amanda.rodrigues
09 Gisele Alcântara Pinho — Não Identificado —
10 Juliana Castro Ritchel juliana.ritchel
11 Julia Meirelles Garcia julia.meirelles
12 Priscila Prado — Não Identificado —

Você deseja atualizar as pessoas que estão com o login de rede preenchido com a string "– Não Identificado –" para NULL apagando assim o conteúdo da coluna para esses registros. Qual o comando mais adequado para efetuar essa operação de exclusão de conteúdo nos registros desejados ?

A. INSERT
B. DELETE
C. UPDATE
D. TRUNCATE

Questão 062
Você está efetuando manutenção em uma aplicação de cadastro institucional. Uma das principais tabelas do modelo é a tabela de Empresas Fornecedoras (EmpFor) representada pela seguinte instrução DDL:

CREATE TABLE EmpFor (
    IDEmpresa INT NOT NULL Identity(1,1) PRIMARY KEY,
    NomeEmpresa VARCHAR(200) NOT NULL,
    NomeFantasia VARCHAR(200) NOT NULL,
    CNPJ CHAR(14) NOT NULL)

O cadastro normalmente é feito com uma empresa por vez, mas eventualmente podem ser cadastradas até três empresas com uma única instrução INSERT. Após a empresa ter sido cadastrada, a coluna IDEmpresa é preenchida automaticamente com um número uma vez que essa coluna possui a propriedade Identity. A aplicação necessita apresentar o número gerado para aplicação. Qual das alternativas abaixo é a mais indicada para exibir o número gerado pela coluna Identity no cadastro das empresas ?

A. @@Identity
B. SCOPE_IDENTITY( )
C. IDENT_CURRENT(‘EmpFor’)
D. OUTPUT INSERTED.IDEmpresa

Respostas

Questão 055
Como uma atividade rotineira de expurgo, você possui uma tabela com 50 bilhões de linhas e precisa excluir o conteúdo dessa tabela gerando o mínimo de overhead para o log de transações e bloqueios para a aplicação. Os itens abaixo devem ser levados em consideração:

  • O comando deve ficar dentro de uma transação
  • A tabela possui uma chave primária composta de três colunas
  • A tabela não está envolvida em nenhum tipo de relacionamento

Qual seria o comando mais adequado para efetuar a exclusão dos registros ?

A. DELETE
B. TRUNCATE TABLE
C. DROP TABLE
D. DBCC REINDEX(‘Tabela’)

Resposta Correta: B

O comando TRUNCATE TABLE é capaz de excluir grandes quantidades de linhas em um tempo mínimo (alguns milissegundos na maioria dos casos) devido a sua natureza minimamente logada. É possível encapsulá-lo em transações e não há problemas em executar o comando contra tabelas que possuam chave primária independente da quantidade de colunas participantes da chave. Se a tabela estiver em um relacionamento não será possível utilizar esse comando (mesmo contra as tabelas filhas).

Respostas Incorretas: A, C, D

A – O comando DELETE é capaz de excluir qualquer quantidade de linhas de uma tabela, mas cada linha excluída será gravada no log de transações. A quantidade linhas em questão irá demandar bastante esforço e espaço do log de transações e não é a melhor alternativa nesse cenário.

C – O comando DROP TABLE exclui todos os registros de uma tabela assim como a própria tabela. Como o objetivo é o expurgo dos dados, a tabela deve permanecer no banco de dados. Mesmo sendo bastante perfomático na exclusão de registros, o comando DROP TABLE não se aplica a esse caso por excluir a tabela completamente e não só suas linhas.

D – A instrução DBCC DBREINDEX é utilizada para reconstruir os índices de uma determinada tabela ou a própria tabela. Esse comando não irá excluir os registros de uma tabela e não se aplica à situação descrita no enunciado.

Questão 056
Você está desenvolvendo uma aplicação de controle de ponto e necessita em um único comando inserir vários registros referente a entrada e saída de funcionários em uma tabela específica chamada Marcacoes.

Matricula Data Hora Tipo
500163 23/11/2010 09:15 Entrada
500163 23/11/2010 12:18 Saída
500163 23/11/2010 14:05 Entrada
500163 23/11/2010 19:23 Saída

Qual seria a melhor forma de desenvolver essa tarefa ?

A. Utilizar o comando INSERT com múltiplos valores
B. Criar um SET de dados com o uso do VALUES e efetuar um INSERT com SELECT
C. Efetuar um INSERT com um SELECT especificando o SET de dados
D. Não é possível inserir múltiplos valores com um único comando de INSERT. Será necessário efetuar um INSERT para cada registro desejado

Resposta Correta: A

Uma das novidades do SQL Server 2008 é a possibilidade de uma única instrução INSERT especificar mais de um registro a ser inserido na tabela. Ex:

INSERT INTO RegistrosPonto (Matricula, Data, Hora, Tipo)
VALUES
    (500163,‘20101123’,’09:15′,‘Entrada’),
    (500163,‘20101123’,’12:18′,‘Saída’),
    (500163,‘20101123’,’14:05′,‘Entrada’),
    (500163,‘20101123’,’19:23′,‘Saída’)

Respostas Incorretas: B, C, D

B – O uso do VALUES também é uma das novidades do Transact-SQL no SQL Server 2008 em conformidade com o padrão ANSI. Ex:

INSERT INTO RegistrosPonto (Matricula, Data, Hora, Tipo)
SELECT Matricula, Data, Hora, Tipo
FROM (VALUES
    (500163,‘20101123’,’09:15′,‘Entrada’),
    (500163,‘20101123’,’12:18′,‘Saída’),
    (500163,‘20101123’,’14:05′,‘Entrada’),
    (500163,‘20101123’,’19:23′,‘Saída’))
    As RegistrosPonto (Matricula, Data, Hora, Tipo)

Embora seja uma construção válida no SQL Server 2008, ela não é tão intuitiva quanto o uso de múltiplos valores em uma instrução INSERT.

C – A especificação do SET de dados era uma alternativa comum nas versões anteriores para inserir múltiplos registros com um único comando. Ex:

INSERT INTO RegistrosPonto (Matricula, Data, Hora, Tipo)
SELECT
    500163 As Matricula,‘20101123’ As Data,’09:15′ As Hora, ‘Entrada’ As Tipo
    UNION ALL
    SELECT 500163,‘20101123’,’12:18′,‘Saída’ UNION ALL
    SELECT 500163,‘20101123’,’12:18′,‘Entrada’ UNION ALL
    SELECT 500163,‘20101123’,’12:18′,‘Saída’

Embora seja uma construção válida no SQL Server 2008, ela demanda mais código que o uso de múltiplos valores com o INSERT.

D – É possível inserir com um único comando INSERT conforme demonstrado nas alternativas A, B e C.

Questão 057
Você está efetuando uma manutenção em aplicação de liberação de acesso às dependências do prédio da sua empresa. Como parte do processo de segurança predial, todas as pessoas que têm registros de entrada no prédio a mais de três meses, devem ser excluídas do cadastro para que sua próxima visita force um recadastro. As entradas mais antigas que três meses também devem ser excluídas. A figura abaixo mostra as tabelas necessárias para efetuar essa manutenção (o relacionamento entre elas não é obrigatório):

Quais dos comandos abaixo é válido para essa tarefa ?

A. DELETE FROM Pessoas FROM Pessoas As P
INNER JOIN Marcacoes As M ON P.RG = M.RG
WHERE M.Data <= DateAdd(MM,-3,GETDATE())

DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE())

B. DELETE FROM (Pessoas
INNER JOIN Marcacoes As M ON P.RG = M.RG)
WHERE M.Data <= DateAdd(MM,-3,GETDATE())

DELETE FROM
Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE())
C. DELETE Pessoas.*
FROM Pessoas As P
INNER JOIN Marcacoes As M ON P.RG = M.RG
WHERE M.Data <= DateAdd(MM,-3,GETDATE())

DELETE FROM Marcacoes WHERE Data <= DateAdd(MM,-3,GETDATE())

D. Todas as combinações são válidas

Resposta Correta: A

A tabeça Marcacoes faz a gravação das marcações das pessoas que entraram no prédio. Para saber as pessoas que entraram no prédio a mais de três meses é necessário efetuar uma junção dessa tabela com a tabela Pessoas para efetuar a exclusão das pessoas que tem registros a mais de três meses. Posteriormente é feita a exclusão das marcações. Apenas a sintaxe na alternativa A é válida no SQL Server (embora a junção proposta não esteja em conformidade com o padrão ANSI sendo portanto uma extensão proprietária).

Respostas Incorretas: B, C, D

B, C, D – Essas não são sintaxes válidas no SQL Server (embora algumas delas funcionem em outros SGBDs com o Access, MySQL, etc)

Questão 058
Um desenvolvedor montou o script abaixo:

SET ANSI_NULL_DFLT_ON OFF

CREATE TABLE Lancamentos (
    IDLancamento INT IDENTITY(1,1),
    DataLancamento DATE DEFAULT GETDATE(),
    CentroCusto CHAR(3) DEFAULT ‘ADM’,
    ValorLancamento SMALLMONEY,
    CONSTRAINT
UQDataCentro UNIQUE (DataLancamento, CentroCusto))

INSERT INTO Lancamentos DEFAULT VALUES

Os dois primeiros comandos do script foram executados com êxito e o terceiro comando (o de INSERT) não foi executado. O que acontecerá se essa instrução de INSERT for executada múltiplas vezes com intervalos de 1 segundo em cada execução ?

A. Ocorrerá um erro de sintaxe em todas as execuções, pois, a sintaxe apresentada não é válida
B. Ocorrerá um erro de execução em todas as execuções
C. A primeira execução será bem sucedida e as execuções subsequentes irão falhar
D. Todas as execuções serão bem sucedidas

Resposta Correta: B

O comando INSERT INTO [Tabela | View] DEFAULT VALUES faz com que seja gerado um novo registro com os valores padrão estabelecidos. Se houver um coluna Identity, ela será incrementada. Se houver uma coluna com uma CONSTRAINT DEFAULT, o valor especificado na CONSTRAINT será incluído, se uma coluna não tiver nenhum valor Default e (ou) valores Identity, ela será preenchida como nula.

O primeiro INSERT produziria o valor 1 para a coluna IDLancamento, a data e hora atuais para a coluna DataLancamento, a string "ADM" para a coluna CentroCusto e o valor NULL para a coluna ValorLancamento. Como a primeira instrução é SET ANSI_NULL_DFLT_ON OFF, por padrão colunas são criadas como NOT NULL. A instrução INSERT com DEFAULT VALUES irá produzir o valor NULL para a coluna ValorLancamento (ela não possui Default) provocando um erro na execução do comando independente da quantidade de execuções, pois, a coluna ValorLancamento não aceita valores nulos.

Respostas Incorretas: A, C, D

A – A construção é válida e não apresenta erros de sintaxe. As falhas na execução se dão por restrições a valores nulos e não por erros de sintaxe.

C – Não há como a primeira execução ser bem sucedida, pois, há uma violação em relação à nulabilidade da coluna ValorLancamento. Se a coluna ValorLancamento permitisse valores nulos essa opção seria a correta. Ainda que haja uma constraint Unique com as colunas DataLancamento e CentroCusto, se cada INSERT fosse executado a cada segundo, o valor da coluna seria diferente. Entretanto, como o tipo de dados é DATE e esse tipo não grava os segundos, haveria uma repetição dos valores dessas colunas provocando a violação da constraint unique para os registros subsequentes.

D – Nenhuma execução pode ser bem sucedida, pois, há uma violação em relação à coluna ValorLancamento.

Questão 059
A empresa RFT Associados é uma empresa forte no ramo de comércio eletrônico. O banco de dados da RFT possui uma tabela central com a relação de produtos da empresa. Para evitar alterações nessa tabela durante o dia, as alterações são cadastras em uma tabela a parte para que ao final do dia, as alterações sejam efetivadas. As tabelas são exibidas na figura abaixo:

Todos os dias em um horário predeterminado, os registros na tabela "Produtos" devem ser atualizados conforme as alterações cadastradas na tabela ProdutosAlteracoes. Qual dos comandos abaixo atendem esse propósito ? Marque todos que se aplicam.

A.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM Produtos
INNER JOIN ProdutosAlteracoes ON Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

B.

UPDATE Produtos SET
    POld.Nome = PNew.Nome, POld.Valor = PNew.Valor,
    POld.Estoque = PNew.Estoque, POld.Descontinuado = PNew.Descontinuado
FROM Produtos As POld
INNER JOIN ProdutosAlteracoes As PNew ON POld.ProdutoID = PNew.ProdutoID

C.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM Produtos, ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

D.

UPDATE Produtos SET
    Nome = ProdutosAlteracoes.Nome, Valor = ProdutosAlteracoes.Valor,
    Estoque = ProdutosAlteracoes.Estoque, Descontinuado = ProdutosAlteracoes.Descontinuado
FROM ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

E.

UPDATE Produtos, ProdutosAlteracoes SET
    Produtos.Nome = ProdutosAlteracoes.Nome, Produtos.Valor = ProdutosAlteracoes.Valor,
    Produtos.Estoque = ProdutosAlteracoes.Estoque, Produtos.Descontinuado = ProdutosAlteracoes.Descontinuado
WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID

F.

UPDATE Produtos INNER JOIN ProdutosAlteracoes
    ON Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID SET
    Produtos.Nome = ProdutosAlteracoes.Nome, Produtos.Valor = ProdutosAlteracoes.Valor,
    Produtos.Estoque = ProdutosAlteracoes.Estoque, Produtos.Descontinuado = ProdutosAlteracoes.Descontinuado

G.

UPDATE Produtos SET (Nome, Valor, Estoque, Descontinuado) = (
    SELECT Nome, Valor, Estoque, Descontinuado FROM ProdutosAlteracoes
    WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID)
WHERE EXISTS (SELECT 1 FROM ProdutosAlteracoes WHERE Produtos.ProdutoID = ProdutosAlteracoes.ProdutoID)

Respostas Corretas: A, C, D

A – Para atualizar uma tabela com base em outro com um único UPDATE é necessário relacionar as tabelas e efetuar a atualização em apenas uma das tabelas (não é possível atualizar duas tabelas com uma única instrução de UPDATE). A sintaxe apresentada é válida no SQL Server embora não esteja em conformidade com o padrão ANSI.

C – A lógica dessa alternativa é idêntica a da alternativa A, exceto pela forma a qual o JOIN foi realizado. Ao invés de usar os operadores de junção (INNER JOIN), a junção foi feita pela cláusula WHERE. Essa é uma sintaxe válida no SQL Server embora não esteja em conformidade com o padrão ANSI.

D – Esse comando é semelhante a da alternativa A, mas há uma particularidade. A tabela a ser atualizada (Produtos) é referenciada logo após o comando UPDATE e somente a tabela de referência (ProdutosAtualizacoes) é referenciada pela cláusula FROM. É uma opção confusa, pois, a referência à tabela Produtos na cláusula FROM juntamente com a tabela ProdutosAlteracoes deixaria o comando mais claro como na alternativa A. A sintaxe é válida no SQL Server embora não esteja em conformidade com o padrão ANSI.

Respostas Incorretas: B, E, F, G

B – A construção é muito semelhante a da alternativa A, mas há um erro de semântica. O UPDATE faz referência à tabela Produtos (UPDATE Produtos SET), mas faz uso do Alias POld para se referir a essa tabela e as colunas alvo de atualização. A referência direta à tabela Produtos antes do operador SET irá anular as referências ao Alias POld retornando um erro de referência "The multi-part identifier "POld.Name" could not be bound"

E – No SQL Server não é possível referenciar duas tabelas para alteração em um mesmo comando. Essa não alternativa corresponde a um erro de sintaxe no SQL Server. Embora não seja válida no SQL Server e não esteja aderente ao padrão ANSI, é uma sintaxe válida no MySQL.

F – O JOIN deve ser feito após a especificação das colunas alteradas e não antes. Essa não alternativa corresponde a um erro de sintaxe no SQL Server. Embora não seja válida no SQL Server e não esteja aderente ao padrão ANSI, é uma sintaxe válida no Access.

G – Essa alternativa é a alternativa prevista pelo padrão ANSI sendo aceita por bancos como o ORACLE e o DB2. Embora seja a recomendação do ANSI, essa opção gera um erro de sintaxe no SQL Server.

Questão 060
Em um determinado sistema de compras que você está efetuando manutenção, há uma tabela de pessoas e os respectivos pontos obtidos após as compras realizadas. Como forma de gratificar os primeiros cinco clientes mais antigos (menor ID), você deseja aumentar em 1000 pontos a pontuação atual.

ID Nome Pontos
01 Marcela 1051
02 Renata 2309
03 Tatiany 4233
04 Sabrina 3225
06 Roberta 1598
08 Amanda 1971
09 Gisele 1236
10 Juliana 5601
11 Julia 3300
12 Priscila 2437

Qual dos comandos abaixo pode fazer isso ?

A. UPDATE Clientes SET Pontos = Pontos + 1000 WHERE ID <= 5
B. UPDATE Clientes SET Pontos = 1000 WHERE ID <= 5
C. UPDATE TOP(5) Clientes SET Pontos = Pontos + 1000
D. Nenhuma das anteriores

Resposta Correta: C

A partir do SQL Server 2005, é permitido o uso do TOP em instruções de INSERT, UPDATE e DELETE. Essa instrução irá atualizar os cinco primeiros registros da tabela.

Respostas Incorretas: A, B, D

A – Os cincos primeiros registros possuem ID igual a 01, 02, 03, 04 e 06, pois, há um GAP e o ID 05 não existe. Assim sendo, o predicado WHERE ID <= 5 contemplaria apenas os cinco primeiros registros.

B – Além de não contemplar os cinco primeiros registros, essa alternativa não aumenta os pontos dos clientes, mas fixa a pontuação em 1.000

D – A alternativa correta é a C.

Questão 061
Você possui uma tabela com os seguintes registros e colunas:

ID Nome Usuário de Rede
01 Marcela Gonçalves marcela.goncalves
02 Renata Maciel Costa renata.costa
03 Tatiany Santos Almeida — Não Identificado —
04 Sabrina Fernandes Moura — Não Identificado —
06 Roberta Lins Silva roberta.lins
08 Amanda Rodrigues Mendes amanda.rodrigues
09 Gisele Alcântara Pinho — Não Identificado —
10 Juliana Castro Ritchel juliana.ritchel
11 Julia Meirelles Garcia julia.meirelles
12 Priscila Prado — Não Identificado —

Você deseja atualizar as pessoas que estão com o login de rede preenchido com a string "– Não Identificado –" para NULL apagando assim o conteúdo da coluna para esses registros. Qual o comando mais adequado para efetuar essa operação de exclusão de conteúdo nos registros desejados ?

A. INSERT
B. DELETE
C. UPDATE
D. TRUNCATE

Resposta Correta: C

O comando UPDATE é capaz de substituir a string "– Não Identificado –" para NULL atualizando a coluna "’Usuário de Rede". O comando é exposto abaixo:

UPDATE <Tabela> SET [Usuário de Rede] = NULL WHERE [Usuário de Rede] = ‘– Não Identificado –‘

Respostas Incorretas: A, B, D

A – O comando INSERT faz a inserção de novos registros e não é capaz de efetuar qualquer alteração nos registros já existentes.

B – O comando DELETE exclui registros em sua totalidade, ou seja, todas a linha e suas colunas e não pode ser utilizado para substituir valores.

C – O comando TRUNCATE é utilizado para exclusões de todos os registros de uma tabela específica e não pode ser utilizado para atualizações.

Questão 062
Você está efetuando manutenção em uma aplicação de cadastro institucional. Uma das principais tabelas do modelo é a tabela de Empresas Fornecedoras (EmpFor) representada pela seguinte instrução DDL:

CREATE TABLE EmpFor (
    IDEmpresa INT NOT NULL Identity(1,1) PRIMARY KEY,
    NomeEmpresa VARCHAR(200) NOT NULL,
    NomeFantasia VARCHAR(200) NOT NULL,
    CNPJ CHAR(14) NOT NULL)

O cadastro normalmente é feito com uma empresa por vez, mas eventualmente podem ser cadastradas até três empresas com uma única instrução INSERT. Após a empresa ter sido cadastrada, a coluna IDEmpresa é preenchida automaticamente com um número uma vez que essa coluna possui a propriedade Identity. A aplicação necessita apresentar o número gerado para aplicação. Qual das alternativas abaixo é a mais indicada para exibir o número gerado pela coluna Identity no cadastro das empresas ?

A. @@Identity
B. SCOPE_IDENTITY( )
C. IDENT_CURRENT(‘EmpFor’)
D. OUTPUT INSERTED.IDEmpresa

Resposta Correta: D

Uma vez que o cadastro pode ser feito com mais de uma empresa simultaneamente, será preciso retornar mais de um ID simultaneamente. A cláusula OUTPUT possibilita mostrar os valores inseridos após o comando de INSERT ter sido disparado. Essa cláusula pode ainda ser utilizada com instruções de UPDATE e DELETE possibilitando visualizar os registros antes e depois da alteração e os registros excluídos respectivamente. A cláusula OUTPUT faz uso das tabelas INSERTED e DELETED que são utilizadas em triggers. O comando para obter os números gerados é exibido logo a seguir:

— Insere duas empresas
INSERT INTO EmpFor (NomeEmpresa, NomeFantasia, CNPJ)
OUTPUT Inserted.IDEmpresa, Inserted.NomeEmpresa VALUES
    (‘The Home Of Music’,‘HOM’,‘10324394000123’),
    (‘PVD Productions’,‘PVK’,‘10256785400014’)

Respostas Incorretas: A, B, C

A, B, C – Essas funções são capazes de recuperar apenas o último Identity inserido. Se o cadastro fosse baseado em uma empresa por vez, seria alternativas a serem avaliadas, mas com a possibilidade de múltiplos cadastros em um único comando, elas não são alternativas válidas, pois, não conseguem recuperar o último número gerado. A função IDENT_CURRENT também é desacolhável em ambientes de maior concorrência.

[ ]s,

Gustavo

Compêndio de XML – Preparação para o exame 70-433 – MCTS Microsoft SQL Server 2008 – Database Development

Boa Noite Pessoal,

Há um tempo atrás recebi um email de mais uma pessoa interessada na prova 70-433 – MCTS Microsoft SQL Server 2008 – Database Development. Dessa vez não foi um email tradicional. Ao invés de receber um email perguntando sobre a prova, o que mais cai, que materiais estudar, etc tive a surpresa de receber um email consolidando vários artigos meus sobre XML e o SQL Server. Em 12/10/2006, no site Plugmasters, eu iniciei a publicação de uma série de artigos relacionados a esse padrão. Naquela época eu tinha acabado de concluir minha monografia de pós-graduação cujo tema foi relacionado a XML e aplicações práticas. Gostei tanto do assunto que resolvi começar a publicar vários artigos relacionados (resultado de horas de estudo e algumas noites de sono perdidas). Eu os utilizei de referência em muitas dúvidas dos fóruns, das comunidades bem como nas aulas como MCT e em alguns Webcasts.

Infelizmente após algum tempo, o site Plugmasters ficou completamente abandonado e acabei por não indicar mais meus artigos que estavam hospedados no site e nem postar mais novos artigos (até porque hoje tenho meu blog para isso). Há algum tempo, ao abrir o site de novo, me deparei com uma poluição visual muito forte, milhares de propagandas, pedidos para instalação de componentes e plug-ins (que muitas vezes são vírus disfarçados) e lá no fundo alguma remota possibilidade de tentar ler algum daqueles artigo. Depois desse dia pensei que estava na hora de começar a publicar os meus melhores artigos daquela época aqui no blog.

Claro que recuperar os artigos, formatar e republicar leva um certo tempo e isso tem sido pra mim um recurso bastante escasso. Felizmente, no referenciado email do início desse post, alguém já compilou todos os meus artigos relacionados a XML (e aplicações no SQL Server) em um PDF.

"Caro Gustavo,

Olá, tudo bem ?

Estou estudando para a prova 70-433, do SQL 2008, e de acordo com minhas pesquisas, caem bastante questões sobre XML. Pesquisando na net, encontrei uma série de artigos seus no site do Plugmasters. Compilei todos eles num documento único, para facilitar os meus estudos. No final, percebi que tinha 75 páginas de informações extremamente úteis sobre o assunto."

Nunca me dei conta do total em páginas desses artigos e para falar a verdade eu não me lembrava nem ao menos quantos artigos eu havia escrito. Há poucas referências sobre XML e embora esse assunto soe mais comum hoje em dia, não é nada incomum encontrar dificuldades para entendê-lo e utilizá-lo. Os artigos foram uma iniciativa para ajudar aqueles que tem dúvidas e dificuldades sobre assunto (como eu um dia tive muitas).

Disponibilizo aqui o documento PDF consolidado com os artigos de XML que publiquei no Plugmasters:

http://cid-f4f5c630410b9865.office.live.com/self.aspx/ProjetosSQLServer/20101217%5E_ResumoArtigosXMLPlugMasters.pdf

Agradeço ao Péricles Sevegnani pela gentileza. O mesmo documento também está disponível no blog dele (http://blogsqlserver.blogspot.com):

Compêndio XML
http://blogsqlserver.blogspot.com/2010/12/compendio-xml.html

Quem quiser estudar para a prova 70-433 e estiver com dificuldades com o XML eu recomendo fortemente a leitura. Acredito que o material seja aplicado a outras provas de certificação que cobrem esse assunto com a 70-451: PRO: Designing Database Solutions and Data Access Using Microsoft SQL Server 2008 ou a 70-454: Upgrade: Transition Your MCITP SQL Server 2005 DBD to MCITP SQL Server 2008 DBD.

[ ]s,

Gustavo

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

Olá Pessoal,

As cinco primeiras partes do simulado cobriram os tópicos "Implementing Tables and Views" e "Implementing Programming Objects" respectivamente cobrindo 14% e 16% do exame 70-433. O próximo tópico "Working with Query Fundamentals" contribui com 21% das questões cobradas no exame. Eis a primeira leva de questões desse tópico.

Questão 046
A tabela "Senhas" possui os seguintes registros:

ID Senha
01 ABC
02 ABCD
03 CDEF
04 %ABCDEF
05 AB_DEF
06 AB%DEF

A instrução SELECT abaixo retornará quantos registros ?

SELECT Senha FROM Senhas WHERE Senha LIKE ‘%%%’

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

Questão 047
A tabela "Senhas" possui os seguintes registros:

ID Senha
01 ABC
02 ABCD
03 CDEF
04 %ABCDEF
05 AB_DEF
06 AB%DEF

Qual das instruções SELECT a seguir irá retornar o registro de ID igual a 05 ? Marque todas que se aplicam

A. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%_%’
B. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%\_%’
C. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%\\_%’
D. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%[_]%’
E. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%_%’ ESCAPE (‘_’)
F. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%?_%’ ESCAPE (‘?_’)
G. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%@_%’

Questão 048
A tabela "Lancamentos" possui os seguintes registros:

CentroCusto Valor
ADM001 1530
ADM001 2150
ADM002 3020
ADM003 1490
ADM003 5310
ADM004 2810
ADM004 7530

A instrução SELECT abaixo retornará quantos registros ?

SELECT CentroCusto, Valor FROM Lancamentos WHERE CentroCusto LIKE ‘ADM00[1-4]’

A. 0
B. 2
C. 4
D. 7

Questão 049
A tabela "Pessoas" possui os seguintes registros:

ID Nome Apelido
01 João João
02 Cléber NULL
03 Leonardo Leo
04 Daniel NULL
05 Fabiana Fabi
06 Wesley NULL

A instrução SELECT abaixo retornará quantos registros ?

SELECT ID, Nome, Apelido FROM Pessoas
WHERE NULLIF(Nome,Apelido) IS NULL

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

Questão 050
A tabela "Pagamentos" possui os seguintes registros:

Referência IDFunc ValorHora TotalHoras SalarioFixo PercentualComissao TotalVendido
2010-11-01 01 50.00 160 NULL NULL NULL
2010-11-01 02 45.00 175 NULL NULL NULL
2010-11-01 03 NULL NULL 5.615,18 NULL NULL
2010-11-01 04 NULL NULL 7.340,20 NULL NULL
2010-11-01 05 NULL NULL NULL 0,10 239.536,95
2010-11-01 06 NULL NULL NULL 0,05 560.390,00

Há funcionários que recebem por hora, outros recebem um salário fixo e outros são comissionados. As regras do cálculo do salário são especificadas a seguir:

  • Recebimento por hora: ValorHora * TotalHoras
  • Salário fixo: SalarioFixo
  • Comissionados: PercentualComissao * TotalVendido

Considerando que a remuneração de um funcionário só pode obedecer uma das três forma de pagamento, qual das instruções SELECT a seguir irá efetuar o cálculo correto ?

A. SELECT Referencia, IDFunc,
    ISNULL(ValorHora * TotalHoras, SalarioFixo, PercentualComissao * TotalVendido) As Salario
FROM Pagamentos
B. SELECT Referencia, IDFunc,
    FIRST-NON-NULL(ValorHora * TotalHoras, SalarioFixo, PercentualComissao * TotalVendido) As Salario
FROM Pagamentos
C. SELECT Referencia, IDFunc,
    COALESCE(ValorHora * TotalHoras, SalarioFixo, PercentualComissao * TotalVendido) As Salario
FROM Pagamentos
D. Nenhuma das anteriores

Questão 051
Considerando a tabela "Produtos" abaixo, quais das instruções SELECT não irá funcionar ?

Produto QuantidadeVendida Preco
HD Móvel 500GB 120 350
Pen Drive 16GB 150 100
Máquina Digital 120 600
A. SELECT Produto, QuantidadeVendida, Preco, QuantidadeVendida * Preco As TotalVendido FROM Produtos
WHERE TotalVendido >= 4000
B. SELECT Produto, QuantidadeVendida, Preco, QuantidadeVendida * Preco As TotalVendido FROM Produtos
ORDER BY TotalVendido DESC
C. SELECT Produto, QuantidadeVendida, Preco, QuantidadeVendida * Preco As TotalVendido FROM Produtos
WHERE QuantidadeVendida * Preco >= 4000
D. SELECT Produto, QuantidadeVendida, Preco, QuantidadeVendida * Preco As TotalVendido FROM Produtos
ORDER BY QuantidadeVendida * Preco DESC

Questão 052
Quais dos tipos de dados abaixo não podem ser utilizados em conjunto com a cláusula ORDER BY ? Marque todos que se aplicam

A. BIGINT
B. TEXT
C. NTEXT
D. XML
E. IMAGE
F. VACHAR(MAX)
G. VARBINARY(MAX)

Questão 053
A tabela "Funcionarios" possui os seguintes registros:

ID Matricula Nome DataDemissao
1 110532 André Alves Moura 12/01/2010
2 20754 Daniela Costa Gonçalves NULL
3 805381 Márcia Souza Pinheiros NULL
4 52312 Rodrigo Bastos Moreira 12/01/2010
5 764234 Antônio Mauro Batista Gomes 04/03/2009

Os tipos de dados das colunas são descritos a seguir:

  • ID: INT
  • Matricula: VARCHAR(10)
  • Nome: VARCHAR(80)
  • DataDemissao: DATE

Qual será a ordem dos IDs retornados tendo por base a seguinte instrução SELECT ?

SELECT ID, Matricula, Nome, DataDemissao FROM Funcionarios
ORDER BY DataDemissao, Matricula

A. 2, 3, 5, 4, 1
B. 2, 3, 5, 1, 4
C. 5, 4, 1, 2, 3
D. 5, 1, 4, 2, 3

Questão 054
A tabela "Funcionarios" possui os seguintes registros:

ID Matricula Nome DataDemissao
1 110532 André Alves Moura 12/01/2010
2 20754 Daniela Costa Gonçalves NULL
3 805381 Márcia Souza Pinheiros NULL
4 52312 Rodrigo Bastos Moreira 12/01/2010
5 764234 Antônio Mauro Batista Gomes 04/03/2009

De forma a preservar a lista de funcionários demitidos em uma tabela a parte chamada "FuncionariosDemitidos", foi executada a seguinte instrução SELECT:

SELECT IDENTITY(INT,1,1) As Ordem, Matricula, DataDemissao INTO FuncionariosDemitidos
FROM Funcionarios
WHERE DataDemissao IS NOT NULL

Considerando que a tabela "FuncionariosDemitidos" não existe antes da execução do comando, qual será o resultado esperado ?

A. Será gerado um erro de sintaxe, pois, a construção IDENTITY(INT,1,1) não é suportada
B. Será gerado um erro de sintaxe, pois, a instrução SELECT INTO só insere os dados se a tabela especificada após a palavra INTO tiver sido criada previamente
C. A tabela FuncionariosDemitidos será criada a partir da consulta na tabela de funcionários, a coluna Ordem terá três valores (1, 2 e 3) porém não será uma coluna Identity
D. A tabela FuncionariosDemitidos será criada a partir da consulta na tabela de funcionários, a coluna Ordem terá três valores (1, 2 e 3) e será uma coluna Identity

Respostas

Questão 046
A tabela "Senhas" possui os seguintes registros:

ID Senha
01 ABC
02 ABCD
03 CDEF
04 %ABCDEF
05 AB_DEF
06 AB%DEF

A instrução SELECT abaixo retornará quantos registros ?

SELECT Senha FROM Senhas WHERE Senha LIKE ‘%%%’

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

Resposta Correta: D

O caractér "%" é um caractér curinga que representa qualquer caractér ou conjunto de caractéres. É comum o seu uso para encontrar textos a partir de um pedaço (ex: LIKE ‘%ABC% para encontrar qualquer coisa que contenha ABC). Como o predicado LIKE especificou %%% na condição de pesquisa, qualquer texto irá obedecer a essa regra. Para recuperar registros que contenham caractéres curingas é necessário o uso de expressões regulares ou caractéres de escape. Ex: LIKE ‘%[%]%’ ou LIKE ‘%\%%’ ESCAPE(‘\’)

Respostas Incorretas: A, B, C

A, B, C – A quantidade de registros informada nessas opções não é igual a quantidade de registros retornada pela consulta.

Referências:
LIKE (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms179859(v=SQL.100).aspx

Questão 047
A tabela "Senhas" possui os seguintes registros:

ID Senha
01 ABC
02 ABCD
03 CDEF
04 %ABCDEF
05 AB_DEF
06 AB%DEF

Qual das instruções SELECT a seguir irá retornar o registro de ID igual a 05 ? Marque todas que se aplicam

A. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%_%’
B. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%\_%’
C. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%\\_%’
D. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%[_]%’
E. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%_%’ ESCAPE (‘_’)
F. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%?_%’ ESCAPE (‘?’)
G. SELECT ID, Senha FROM Senhas WHERE Senha LIKE ‘%@_%’

Respostas Corretas: D e F

Os predicados baseados em LIKE permitem a especificação de caractéres curingas como "%" e "_". O % representa qualquer conjunto de caractéres e o "_" representa um único caractér. O registro de ID de ID 5 possui o caractér "_" porém a especificação desse caractér em conjunto com o LIKE irá representar o caractér curinga e não o caractér "_" propriamente dito. Para pesquisar os registro com o "_" é necessário colocá-lo em uma expressão regular com o uso de colchetes (alternativa D) ou com um caractér de escape (alternativa F). O uso do ESCAPE com o caractér "?" torna esse último como caractér de escape. Como o caractér "?" precede o caractér "_", esse último não será considerado como caractér curinga, mas um caractér de pesquisa normal.

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

A – O caractér % é um curinga e representa qualquer combinação de caractéres, o caractér _ também é um caractér curinga porém representa um único caractér. O predicado LIKE ‘%_%’ informa, em outras palavras, qualquer texto que tenha um conjunto de caractéres qualquer, um caractér no meio e qualquer conjunto de caractéres ao final. Essa combinação irá recuperar todas as linhas.

B – Embora o caractér \ normalmente indique um caractér de escape em várias linguagens de programação e algumas expressões regulares esse não é o caso do T-SQL e dialetos SQL em geral. Essa consulta irá procurar textos que possuam o caractér "\" e não irá retornar o registro de ID igual a 5.

C – Assim como na alternativa B, utilizar o caractér "\" (mesmo que duas vezes) não tem o efeito de caractér de escape. O predicado especificado irá procurar por registros que tenham os caractéres \\ e não irá retornar o registro de ID igual a 5

E – A especificação de um caractér de escape possibilita pesquisar por textos que contenham caractéres curingas como o "%" e o "_" considerando-os como caractéres normais, mas é necessário especificar o caractér de escape e não o caractér curinga a ser pesquisado

G – Assim como nas alternativas B e C, o uso do caractér @ não indicará uma caractér de escape. Essa instrução apenas pesquisará por textos que possuam o caractér "@" não retornando o registro de ID igual a 5.

Referências:
LIKE (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms179859(v=SQL.100).aspx

Questão 048
A tabela "Lancamentos" possui os seguintes registros:

CentroCusto Valor
ADM001 1530
ADM001 2150
ADM002 3020
ADM003 1490
ADM003 5310
ADM004 2810
ADM004 7530

A instrução SELECT abaixo retornará quantos registros ?

SELECT CentroCusto, Valor FROM Lancamentos WHERE CentroCusto LIKE ‘ADM00[1-4]’

A. 0
B. 2
C. 4
D. 7

Resposta Correta: D

Os predicados baseados no uso do LIKE permitem a especificação de expressões regulares como critério de pesquisa. O critério de pesquisa contemplado pelo LIKE informa que os textos pesquisados devem iniciar com a string "ADM00" e o caractér seguinte pode ser qualquer número entre 1 e 4. Isso possibilita pesquisar todos os registros cuja coluna CentroCusto seja igual a ADM001, ADM002, ADM003 ou ADM004 retornando os sete registros.

Resposta Incorretas: A, B, C

A, B – Serão retornados sete registros ao total

C – O critério de pesquisa ADM00[1-4] pode dar a falsa impressão de que apenas os centros de custo "ADM001" e "ADM004" podem ser retornados, mais o sufixo [1-4] inclui todos os números entre 1 e 4 não os números 1 e 4.

Referências:
LIKE (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms179859(v=SQL.100).aspx

Questão 049
A tabela "Pessoas" possui os seguintes registros:

ID Nome Apelido
01 João João
02 Cléber NULL
03 Leonardo Leo
04 Daniel NULL
05 Fabiana Fabi
06 Wesley NULL

A instrução SELECT abaixo retornará quantos registros ?

SELECT ID, Nome, Apelido FROM Pessoas
WHERE NULLIF(Nome,Apelido) IS NULL

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

Resposta Correta: B

A função NULLIF retorna NULL quando os dois parâmetros informados tem exatamente o mesmo conteúdo. Apenas o registro de ID possui o nome igual ao sobrenome e será o único registro retornado. Caso os parâmetros não tenham o mesmo conteúdo é retornado o valor do primeiro parâmetro.

Respostas Incorretas: A, C, D

A, C, D – A quantidade de registros informadas não é igual a quantidade de registros retornada.

Referências:
NULLIF (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms177562(v=SQL.100).aspx

Questão 050
A tabela "Pagamentos" possui os seguintes registros:

Referência IDFunc ValorHora TotalHoras SalarioFixo PercentualComissao TotalVendido
2010-11-01 01 50.00 160 NULL NULL NULL
2010-11-01 02 45.00 175 NULL NULL NULL
2010-11-01 03 NULL NULL 5.615,18 NULL NULL
2010-11-01 04 NULL NULL 7.340,20 NULL NULL
2010-11-01 05 NULL NULL NULL 0,10 239.536,95
2010-11-01 06 NULL NULL NULL 0,05 560.390,00

Há funcionários que recebem por hora, outros recebem um salário fixo e outros são comissionados. As regras do cálculo do salário são especificadas a seguir:

  • Recebimento por hora: ValorHora * TotalHoras
  • Salário fixo: SalarioFixo
  • Comissionados: PercentualComissao * TotalVendido

Considerando que a remuneração de um funcionário só pode obedecer uma das três forma de pagamento, qual das instruções SELECT a seguir irá efetuar o cálculo correto ?

A. SELECT Referencia, IDFunc,
    ISNULL(ValorHora * TotalHoras, SalarioFixo, PercentualComissao * TotalVendido) As Salario
FROM Pagamentos
B. SELECT Referencia, IDFunc,
    FIRST-NON-NULL(ValorHora * TotalHoras, SalarioFixo, PercentualComissao * TotalVendido) As Salario
FROM Pagamentos
C. SELECT Referencia, IDFunc,
    COALESCE(ValorHora * TotalHoras, SalarioFixo, PercentualComissao * TotalVendido) As Salario
FROM Pagamentos
D. Nenhuma das anteriores

Resposta Correta: C

O salário é calculado por três formas de recebimento mutuamente excludentes, ou seja, caso o funcionário recebe por hora não poderá ter um salário fixo e nem uma comissão. Caso receba uma salário fixo não receberá por hora e nem por comissão. Caso receba por comissão não receberá por hora e nem um salário fixo.

Uma forma de efetuar o cálculo seria utilizar CASEs aninhados para efetuar testes sobre a forma de pagamento. Ex:

CASE WHEN ValorHora IS NOT NULL THEN ValorHora * TotalHoras
    ELSE
    CASE WHEN
SalarioFixo IS NOT NULL THEN SalarioFixo
        ELSE PercentualComissao * TotalVendido END
    END

Uma das formas mais eficientes de efetuar essa avaliação é utilizar a função COALESCE. Essa função pode receber vários parâmetros e retornará a primeira combinação não nula. Os parâmetros utilizados são justamente as formas de recebimento e a primeira não nula é a retornada para cada registro permitindo assim o retorno correto.

Respostas Incorretas: A, B, D

A – O uso do ISNULL seria adequado, mas essa função está limitada a dois parâmetros e as formas de recebimento consistem em três possibilidades. O uso do ISNULL com três parâmetros gera um erro de sintaxe. O uso do ISNULL pode ser aninhado, mas isso seria um código menos enxuto que o o COALESCE.

B – A função FIRST-NON-NULL não existe no SQL Server.

D – A opção correta é a C.

Referências:
COALESCE (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms190349(v=SQL.100).aspx

ISNULL (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms184325(v=SQL.100).aspx

Questão 051
Considerando a tabela "Produtos" abaixo, quais das instruções SELECT não irá funcionar ?

Produto QuantidadeVendida Preco
HD Móvel 500GB 120 350
Pen Drive 16GB 150 100
Máquina Digital 120 600
A. SELECT Produto, QuantidadeVendida, Preco, QuantidadeVendida * Preco As TotalVendido FROM Produtos
WHERE TotalVendido >= 4000
B. SELECT Produto, QuantidadeVendida, Preco, QuantidadeVendida * Preco As TotalVendido FROM Produtos
ORDER BY TotalVendido DESC
C. SELECT Produto, QuantidadeVendida, Preco, QuantidadeVendida * Preco As TotalVendido FROM Produtos
WHERE QuantidadeVendida * Preco >= 4000
D. SELECT Produto, QuantidadeVendida, Preco, QuantidadeVendida * Preco As TotalVendido FROM Produtos
ORDER BY QuantidadeVendida * Preco DESC

Resposta Correta: A

A avaliação lógica de uma consulta obedece algumas etapas básicas a seguir:

01 – Junção das tabelas especificadas na cláusula FROM
02 – Filtro dos registros baseados na cláusula WHERE
03 – Sumarização baseada na cláusula GROUP BY
04 – Filtro dos registros baseados na cláusula HAVING
05 – Exibição das colunas especificadas na cláusula SELECT
06 – Ordenação dos dados conforme os critérios da cláusula ORDER BY

O alias "TotalVendido" foi definido para uma expressão (QuantidadeVendida * Preco). Como a cláusula WHERE é processada antes da cláusula SELECT não teria como a cláusula WHERE conhecer previamente a coluna TotalVendido (derivada da expressão QuantidadeVendida * Preco). Assim sendo, essa consulta geraria um erro "Invalid Column Name", pois, a coluna é desconhecida para cláusula WHERE.

Respostas Incorretas: B, C, D

B – Na ordem de avaliação, a cláusula ORDER BY é definida após a cláusula SELECT. Assim sendo, para ordenações, é plenamente possível utilizar uma expressão (Alias) como critério de ordenação.

C – Não há restrições em filtrar registros tendo por base predicados baseados em expressão.

D – Não há restrições em ordenar registros tendo por base predicados baseados em expressão, respeitados os tipos válidos para ORDER BY.

Referências:
Logical Query Processing Poster (By Itzik Ben-Gan)
http://www.sql.co.il/books/insidetsql2008/Logical%20Query%20Processing%20Poster.pdf

Questão 052
Quais dos tipos de dados abaixo não podem ser utilizados em conjunto com a cláusula ORDER BY ? Marque todos que se aplicam

A. BIGINT
B. TEXT
C. NTEXT
D. XML
E. IMAGE
F. VACHAR(MAX)
G. VARBINARY(MAX)

Respostas Corretas: B, C, D, E

A cláusula ORDER BY não suporta tipo NTEXT, TEXT, IMAGE ou XML.

Respostas Incorretas: A, F, G

A, F, G – Esses tipos não estão entre os tipos restritos para cláusulas ORDER BY. Embora os tipos VARCHAR(MAX) e VARBINARY(MAX) sejam utilizados para armazenamento de dados LOB (Large Objects), as restrições não se aplicam a esses tipos.

Referências:
ORDER BY (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188385(v=SQL.100).aspx

Questão 053
A tabela "Funcionarios" possui os seguintes registros:

ID Matricula Nome DataDemissao
1 110532 André Alves Moura 12/01/2010
2 20754 Daniela Costa Gonçalves NULL
3 805381 Márcia Souza Pinheiros NULL
4 52312 Rodrigo Bastos Moreira 12/01/2010
5 764234 Antônio Mauro Batista Gomes 04/03/2009

Os tipos de dados das colunas são descritos a seguir:

  • ID: INT
  • Matricula: VARCHAR(10)
  • Nome: VARCHAR(80)
  • DataDemissao: DATE

Qual será a ordem dos IDs retornados tendo por base a seguinte instrução SELECT ?

SELECT ID, Matricula, Nome, DataDemissao FROM Funcionarios
ORDER BY DataDemissao, Matricula

A. 2, 3, 5, 4, 1
B. 2, 3, 5, 1, 4
C. 5, 4, 1, 2, 3
D. 5, 1, 4, 2, 3

Resposta Correta: A

Na avaliação da cláusula ORDER BY, os valores nulos são avaliados primeiro (IDs 2 e 3). No caso do primeiro critério da cláusula incorrer em um empate, o próximo critério deve ser avaliado. A coluna matricula do registro de ID igual a 2 tem valor inferior à coluna matricula do registro de ID igual a 3.

Os demais registros (IDs 1, 4 e 5) possuem a coluna DataDemissao preenchida e como o registro de ID igual a 5 tem o menor valor para essa coluna é o próximo a ser contemplado na ordem. O registro de ID igual a 1 tem a coluna matricula igual a 110532 e o registro de ID igual a 4 tem a coluna matricula com o valor de 52312. Numericamente, o valor 52312 é inferior a 110532, mas como o tipo da dados da coluna é VARCHAR(10), o texto "110532" é inferior ao texto "52312" fazendo com que o ID 4 seja retornado antes do ID 1.

Respostas Incorretas: B, C, D

B – Essa alternativa estaria correta se o tipo de dados da coluna matricula fosse numérico, pois, o valor 52312 seria inferior ao valor 110532. Como o tipo de dados é textual, essa não é a ordem correta.

C, D – Os valores nulos são avaliados primeiro em uma cláusula ORDER BY.

Referências:
ORDER BY (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188385(v=SQL.100).aspx

Questão 054
A tabela "Funcionarios" possui os seguintes registros:

ID Matricula Nome DataDemissao
1 110532 André Alves Moura 12/01/2010
2 20754 Daniela Costa Gonçalves NULL
3 805381 Márcia Souza Pinheiros NULL
4 52312 Rodrigo Bastos Moreira 12/01/2010
5 764234 Antônio Mauro Batista Gomes 04/03/2009

De forma a preservar a lista de funcionários demitidos em uma tabela a parte chamada "FuncionariosDemitidos", foi executada a seguinte instrução SELECT:

SELECT IDENTITY(INT,1,1) As Ordem, Matricula, DataDemissao INTO FuncionariosDemitidos
FROM Funcionarios
WHERE DataDemissao IS NOT NULL

Considerando que a tabela "FuncionariosDemitidos" não existe antes da execução do comando, qual será o resultado esperado ?

A. Será gerado um erro de sintaxe, pois, a construção IDENTITY(INT,1,1) não é suportada
B. Será gerado um erro de execução, pois, a instrução SELECT INTO só insere os dados se a tabela especificada após a palavra INTO tiver sido criada previamente
C. A tabela FuncionariosDemitidos será criada a partir da consulta na tabela de funcionários, a coluna Ordem terá três valores (1, 2 e 3) porém não será uma coluna Identity
D. A tabela FuncionariosDemitidos será criada a partir da consulta na tabela de funcionários, a coluna Ordem terá três valores (1, 2 e 3) e será uma coluna Identity

Resposta Correta: D

A instrução SELECT INTO cria uma nova tabela a partir de uma consulta. A expressão IDENTITY(INT,1,1) irá criar uma coluna a parte do tipo INT e Identity iniciando com o valor 1 (SEED) e incrementando os valores de 1 em 1 (Increment).

Respostas Incorretas: A, B, C

A – Essa construção é suportada, porém somente em instruções SELECT que contemplem o INTO. Não é possível utilizá-la em qualquer instrução SELECT

B – A instrução SELECT INTO cria uma tabela a parte dispensando sua existência prévia. Caso a tabela referenciada pelo INTO exista, então sim ocorrerá um erro de execução (There is already an object named ‘FuncionariosDemitidos’ in the database)

C – A expressão IDENTITY(INT,1,1) cria uma nova coluna Identity e preserva essa propriedade após a carga dos dados.

Referências:
ORDER BY (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188385(v=SQL.100).aspx

[ ]s,

Gustavo

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

Mundo .NET Ed. № 21 – Implementações de mensageria no SQL Server

Boa Noite Pessoal,
 
Mais uma vez tive a oportunidade de escrever um artigo para a revista Mundo .NET. Já há algum tempo eu havia submetido esse artigo para análise e felizmente esse mês ele foi publicado. Assim como as participações anteriores, o artigo foi publicado na sessão de casos de sucesso, ou seja, aquelas implementações voltadas para um problema de negócio em particular.
 
Um assunto que gosto muito no SQL Server é o Service Broker. Esse recurso está disponível desde o SQL Server 2005 e acho impressionante sua vasta aplicabilidade em várias situações de negócio. A possibilidade que o broker oferece para trabalhar com recursos de mensageria e programação assícrona é a solução para muitos problemas nos quais o tradicional RPC não é a melhor opção. Minha principal motivação por esse tema é que mesmo entre os grandes autores, muitas vezes ele fica deixado um pouco de lado e não há tanta bibliografia disponível (e aplicável) sobre esse assunto.
 
No artigo eu demonstro como o Service Broker pode auxiliar um processo de fechamento em uma instituição financeira além de viabilizar um processamento entre várias bases de dados garantindo bons níveis de escalabilidade e desempenho.
 
Aos que adquirirem a revista, espero que apreciem o material publicado nessa edição. Aos que não conhecem a revista Mundo .NET abaixo o link do site oficial da revista.
 
 
[ ]s,
 
Gustavo

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

Boa Noite Pessoal,

Essa parte do simulado irá dar continuidade ao tópico "Implementing Programming Objects".

Questão 030
Quais das seguintes tabelas podem ser utilizadas dentro de uma trigger ? Marque todas que se aplicam

A. INSERTED
B. UPDATED
C. DELETED
D. OUTPUT
E. VERSIONED (apenas se o nível de isolamento for SNAPSHOT)
F. OLD
G. NEW

Questão 031
O implementador de banco de dados criou uma tabela de Clientes com a opção SET ANSI_NULL_DFLT_ON conforme o script abaixo:

CREATE TABLE Clientes (
    IDCliente INT NOT NULL,
    NomeCliente VARCHAR(60) NOT NULL,
    Renda MONEY,
    CPF CHAR(11) NOT NULL,
CONSTRAINT PK_Cliente PRIMARY KEY (IDCliente),
CONSTRAINT CK_Renda CHECK (Renda > 0))

A tabela possui uma CHECK Constraint e uma trigger AFTER. A CHECK Constraint verifica se a coluna "Renda" é maior que zero e a trigger faz um registro em uma tabela de auditoria informando o nome do operador que fez o cadastro. Acidentalmente um operador fez dois cadastros atípicos. No primeiro cadastro ele informou a renda igual a zero e no segundo a renda nula. Qual é o efeito esperado ?

A. Ocorrerá um erro nos dois cadastros, mas a trigger irá disparar em ambos os cadastros
B. Ocorrerá um erro nos dois cadastros e a trigger não irá disparar em ambos os cadastros
C. O 1º cadastro será rejeitado e o 2º permitido e haverá disparo da trigger em ambos os cadastros
D. O 1º cadastro será permitido e o 2º rejeitado e haverá disparo da trigger em ambos os cadastros
E. O 1º cadastro irá falhar e a trigger não será disparada. O segundo cadastro será feito normalmente com disparo da trigger

Questão 032
Você é um implementador de banco de dados de uma companhia de seguros. As informações sobre as apólices de seguro são armazenadas em um banco SQL Server 2008. Você criou uma tabela chamada Apolice para esse banco de dados através do script a seguir:

CREATE TABLE Apolice (
    NumeroApolice INT NOT NULL DEFAULT (0),
    SobreNomeSegurado VARCHAR(50) NOT NULL,
    PrimeiroNomeSegurado VARCHAR(50) NOT NULL,
    AniversarioSegurado DATE NOT NULL,
    DataApolice DATE NOT NULL,
    ValorFace MONEY NOT NULL,
    CONSTRAINT PK_Apolice PRIMARY KEY (NumeroApolice))

Cada vez que a companhia vender uma nova apólice, a apólice deve receber um número único. O banco de dados deve atribuir o novo número da apólice assim que ela for cadastrada. O que você deve fazer ?

A. Criar uma trigger Instead Of Insert para gerar o número da apólice e incluir o número gerado juntamente com os dados da tabela INSERTED na tabela Apolice
B. Criar uma trigger Instead Of Update para gerar o número da apólice e incluir o número gerado juntamente com os dados da tabela INSERTED na tabela Apolice
C. Criar uma trigger After Update para gerar o número da apólice e incluir o número gerado juntamente com os dados da tabela INSERTED na tabela Apolice
D. Substituir o Default por uma trigger AFTER INSERT que gere o número da apólice e incluir o número gerado juntamente com os dados da tabela  INSERTED na tabela Apolice

Questão 033
Quais dos comandos abaixo não podem ser executados dentro de uma trigger DML ? Marque todas que se aplicam

A. TRUNCATE TABLE
B. ALTER DATABASE
C. EXEC PROCEDURE
D. XP_CMDSHELL
E. RECONFIGURE
F. SELECT * FROM
G. CREATE DATABASE

Questão 034
Você é o arquiteto do time de desenvolvimento de uma empresa atuante no mercado financeiro. Foi requerido de você uma forma de auditar todas as alterações nas estruturas das tabelas de um banco de dados chamado AnaliseCredito. Qual a melhor implementação para atender a essa necessidade ?

A. Triggers DML
B. Logon Triggers
C. DDL Triggers
D. Schema Triggers
E. System Triggers

Questão 035
Qual das alternativas abaixo pode ser utilizada para recuperar dados sobre objetos alterados dentro de uma trigger DDL após o seu disparo ?

A. INSERTED
B. DELETED
C. UPDATED
D. EVENTDATA()
E. METADATA()

Questão 036
Na fábrica de software onde você trabalha surgiu um projeto em SQL Server 2008 que irá manipular dados de planilhas em Excel. Como o Integration Services não está disponível, a manipulação desses dados será feita através de CLR. Uma função irá ler dados de planilhas em Excel, efetuar alguns cálculos estatísticos e retornar os dados para o SQL Server. Você necessita registrar o Assembly no SQL Server através da instrução CREATE ASSEMBLY da forma mais segura possível. Qual permissão deve ser utilizada ?

A. SAFE
B. EXTERNAL_ACCESS
C. UNSAFE
D. DEFAULT

Questão 037
Você é um programador da equipe de desenvolvimento de software de uma empresa de E-Commerce e necessita implementar um função que implemente o algoritmo HASH MD5 para criptografar dados sigilosos. Qual implementação deveria ser utilizada ?

A. CLR Function
B. CLR Stored Procedure
C. CLR User Defined Type
D. Nenhuma das anteriores, pois, a função HashBytes é nativa do SQL Server e pode implementar o algoritmo MD5

Respostas

Questão 030
Quais das seguintes tabelas podem ser utilizadas dentro de uma trigger ? Marque todas que se aplicam

A. INSERTED
B. UPDATED
C. DELETED
D. OUTPUT
E. VERSIONED (apenas se o nível de isolamento for SNAPSHOT)
F. OLD
G. NEW

Respostas Corretas: A, C
Explicação: A tabela INSERTED e DELETED são um tipo especial de tabelas temporárias que podem ser acessadas dentro de uma trigger. A estrutura dessas tabelas é exatamente a mesma da tabela onde a trigger foi criada. A tabela INSERTED possui os registros criados após um evento de INSERT e a tabela DELETED possui os registros excluídos após um evento de DELETE. Para eventos de UPDATE, a tabela INSERTED contém os registros afetados com seus respectivos valores após a alteração enquanto que a tabela DELETE contém os registros afetados com seus respectivos valores antes da alteração.

Respostas Incorretas: B, D, E, F, H
Nenhuma dessas tabelas existe dentro de triggers no SQL Server.

Questão 031
O implementador de banco de dados criou uma tabela de Clientes com a opção SET ANSI_NULL_DFLT_ON conforme o script abaixo:

CREATE TABLE Clientes (
    IDCliente INT NOT NULL,
    NomeCliente VARCHAR(60) NOT NULL,
    Renda MONEY,
    CPF CHAR(11) NOT NULL,
CONSTRAINT PK_Cliente PRIMARY KEY (IDCliente),
CONSTRAINT CK_Renda CHECK (Renda > 0))

A tabela possui uma CHECK Constraint e uma trigger AFTER. A CHECK Constraint verifica se a coluna "Renda" é maior que zero e a trigger faz um registro em uma tabela de auditoria informando o nome do operador que fez o cadastro. Acidentalmente um operador fez dois cadastros atípicos. No primeiro cadastro ele informou a renda igual a zero e no segundo a renda nula. Qual é o efeito esperado ?

A. Ocorrerá um erro nos dois cadastros, mas a trigger irá disparar em ambos os cadastros
B. Ocorrerá um erro nos dois cadastros e a trigger não irá disparar em ambos os cadastros
C. O 1º cadastro será rejeitado e o 2º permitido e haverá disparo da trigger em ambos os cadastros
D. O 1º cadastro será permitido e o 2º rejeitado e haverá disparo da trigger em ambos os cadastros
E. O 1º cadastro irá falhar e a trigger não será disparada. O segundo cadastro será feito normalmente com disparo da trigger

Resposta Correta: E

Explicação: Triggers AFTER são disparadas após o evento de origem ter sido executado. Se uma CONSTRAINT for violada (PK, FK, NOT NULL, Check, etc) o evento não será concluído e por isso uma trigger AFTER não poderá ser disparada. No caso do 1º cadastro a renda é igual a zero e portanto a Check Constraint é violada. Essa violação irá impedir que o registro seja inserido e a trigger não será disparada. No caso do 2º cadastro, a renda nula é permitida, pois, por padrão CHECK Constraint não rejeitam registros nulos (a menos que se coloque essa restrição na especificação da CHECK Constraint). O uso da opção SET ANSI_NULL_DFLT_ON garante que a coluna foi criada de forma a permitir valores nulos e portanto o 2º registro será considerado válido. Uma vez que o registro foi realizado sem violar constraints, a trigger será disparada para o 2º cadastro.

Respostas Incorretas: A, B, C, D

A, B, C, D – A constraint CK_Renda só será violada no primeiro cadastro incorrendo em erro. Como a coluna Renda permite valores nulos, no segundo cadastro não haverá violação da constraint e não irá ocorrer um erro havendo assim disparo da trigger apenas para o segundo cadastro.

Questão 032
Você é um implementador de banco de dados de uma companhia de seguros. As informações sobre as apólices de seguro são armazenadas em um banco SQL Server 2008. Você criou uma tabela chamada Apolice para esse banco de dados através do script a seguir:

CREATE TABLE Apolice (
    NumeroApolice INT NOT NULL DEFAULT (0),
    SobreNomeSegurado VARCHAR(50) NOT NULL,
    PrimeiroNomeSegurado VARCHAR(50) NOT NULL,
    AniversarioSegurado DATE NOT NULL,
    DataApolice DATE NOT NULL,
    ValorFace MONEY NOT NULL,
    CONSTRAINT PK_Apolice PRIMARY KEY (NumeroApolice))

Cada vez que a companhia vender uma nova apólice, a apólice deve receber um número único. O banco de dados deve atribuir o novo número da apólice assim que ela for cadastrada. O que você deve fazer ?

A. Criar uma trigger Instead Of Insert para gerar o número da apólice e incluir o número gerado juntamente com os dados da tabela INSERTED na tabela Apolice
B. Criar uma trigger Instead Of Update para gerar o número da apólice e incluir o número gerado juntamente com os dados da tabela INSERTED na tabela Apolice
C. Criar uma trigger After Update para gerar o número da apólice e incluir o número gerado juntamente com os dados da tabela INSERTED na tabela Apolice
D. Substituir o Default por uma trigger AFTER INSERT que gere o número da apólice e incluir o número gerado juntamente com os dados da tabela  INSERTED na tabela Apolice

Resposta Correta: A

Explicação: Esse cenário impõe a unicidade do número da apólice através da constraint PK_Apolice. Para que a constraint não seja violada é preciso que o número da apólice seja gerado antes do evento de INSERT. Isso pode ser obtido através de uma trigger Instead Of Insert, ou seja, ao invés do INSERT. A trigger pode gerar o número e juntamente com os demais dados presentes na tabela INSERTED efetuar a inserção na tabela Apolice. Embora o uso de uma trigger possa ser utilizado nesse caso, recomenda-se o uso da propriedade Identity para que o número seja gerado sequencialmente. O uso do Identity possui menos overhead que uma trigger.

Respostas Incorretas: B, C, D

B – Uma trigger Instead Of Update pode ser utilizada para substituir o evento de Update. Entretanto, quando uma apólice é vendida, os dados serão inseridos ao invés de atualizados. Assim sendo a trigger de Update não irá disparar, pois, não ocorreu um evento de update.

C – Uma trigger After Update é utilizada para executar uma ação após um comando de update ter ocorrido. Como a venda da apólice incorre em uma inserção de dados e não em uma atualização de dados, a trigger não seria disparada.

D – A coluna NumeroApolice é NOT NULL e a remoção do DEFAULT irá impedir que o INSERT seja executado já que por ser chave primária essa coluna não aceita valores nulos. Como a trigger AFTER INSERT é executa após o evento de INSERT e o NOT NULL não permitirá que esse ocorra, a trigger não irá disparar. Na hipótese do DEFAULT ser mantido, uma trigger After Insert poderá gerar o número após o evento de INSERT ter ocorrido. Como a ação da trigger AFTER é executada após a ocorrência do evento de INSERT, não há garantias de que a constraint PK_Apolice não seja violada. Caso a constraint PK_Apolice seja violada, a trigger não será disparada e o número não será gerado.

Questão 033
Quais dos comandos abaixo não podem ser executados dentro de uma trigger DML ? Marque todas que se aplicam

A. TRUNCATE TABLE
B. ALTER DATABASE
C. EXEC PROCEDURE
D. XP_CMDSHELL
E. RECONFIGURE
F. SELECT * FROM
G. CREATE DATABASE

Respostas Corretas: B, E, G

Explicação: As triggers por padrão não suportam que os comandos ALTER DATABASE, RECONFIGURE e CREATE DATABASE sejam incluídos em seu escopo. Esses comandos além de não serem tolerados em triggers também não podem estar inclusos em um contexto transacional.

Respostas Incorretas: A, C, D, F

A, C, D, F – Todos esses comandos podem estar dentro do corpo da trigger sem restrições

Questão 034
Você é o arquiteto do time de desenvolvimento de uma empresa atuante no mercado financeiro. Foi requerido de você uma forma de auditar todas as alterações nas estruturas das tabelas de um banco de dados chamado AnaliseCredito. Qual a melhor implementação para atender a essa necessidade ?

A. Triggers DML
B. Logon Triggers
C. DDL Triggers
D. Schema Triggers
E. System Triggers

Resposta Correta: C

Explicação: Triggers DDL reagem a eventos DDL (Data Definition Language). Os eventos DDL mais comuns são instruções de CREATE, ALTER e DROP. A trigger DDL é disparada logo após a ocorrência de um desses eventos. Para monitorar alterações contra tabelas, as triggers DDL contém os eventos CREATE_TABLE, ALTER_TABLE e DROP_TABLE. Além do uso de triggers DDL, é possível adotar outras soluções como SQL Trace, Event Notification, etc.

Respostas Incorretas: A, B, D, E

A – Triggers DML reagem a eventos DML (Data Manipulation Language). Eventos DML são aqueles de manipulação de dados e são normalmente representados pelos comandos INSERT, UPDATE e DELETE. Instruções DML podem atuar sobre os dados de uma tabela, mas não sobre suas estruturas.

B – Logon Triggers são disparadas quando um login autentica-se no SQL Server. Esse tipo de trigger é útil para monitorar acessos ao SQL Server, mas não é capaz de auditar alterações nas tabelas de um banco de dados específico.

D – Não existem triggers do tipo Schema

E – Não existem triggers do tipo System

Questão 035
Qual das alternativas abaixo pode ser utilizada para recuperar dados sobre objetos alterados dentro de uma trigger DDL após o seu disparo ?

A. INSERTED
B. DELETED
C. UPDATED
D. EVENTDATA()
E. METADATA()

Resposta Correta: D

A função EVENTDATA() retorna um documento XML contendo vários dados sobre o evento que disparou a trigger, os objetos afetados, horário, etc.

Respostas Incorretas: A, B, C, E

A, B – As tabelas INSERTED e DELETED são utilizadas para capturar dados oriundos de operações DML e não estão disponíveis em triggers DDL.

C – Não existe a tabela UPDATED dentro de triggers no SQL Server

E – Não existe uma função METADATA() no SQL Server

Questão 036
Na fábrica de software onde você trabalha surgiu um projeto em SQL Server 2008 que irá manipular dados de planilhas em Excel. Como o Integration Services não está disponível, a manipulação desses dados será feita através de CLR. Uma função irá ler dados de planilhas em Excel, efetuar alguns cálculos estatísticos e retornar os dados para o SQL Server. Você necessita registrar o Assembly no SQL Server através da instrução CREATE ASSEMBLY da forma mais segura possível. Qual permissão deve ser utilizada ?

A. SAFE
B. EXTERNAL_ACCESS
C. UNSAFE
D. DEFAULT

Resposta Correta: B

Explicação: Como a função CLR irá manipular arquivos, é necessário acesso ao sistema de arquivos (FileSystem). As opções EXTERNAL_ACCESS e UNSAFE permitem o acesso ao sistema de arquivos, porém a opção UNSAFE é menos segura por permitir acesso irrestrito incluse a código não gerenciado incorrendo em maiores riscos. A opção EXTERNAL_ACCESS é uma alternativa mais segura.

Respostas Incorretas: A, C, D

A – A opção SAFE é a mais segura, porém ela não concederá acesso ao sistema de arquivos que é necessário para o funcionamento correto da função.

C – A opção UNSAFE permitirá acesso ao sistema de arquivos, porém é uma alternativa menos segura que a opção EXTERNAL_ACCESS.

D – As opções DEFAULT e SAFE são idênticas e não permitem acesso ao sistema de arquivos.

Questão 037
Você é um programador da equipe de desenvolvimento de software de uma empresa de E-Commerce e necessita implementar um função que implemente o algoritmo HASH MD5 para criptografar dados sigilosos. Qual implementação deveria ser utilizada ?

A. CLR Function
B. CLR Stored Procedure
C. CLR User Defined Type
D. Nenhuma das anteriores, pois, a função HashBytes é nativa do SQL Server e pode implementar o algoritmo MD5

Resposta Correta: D

Explicação: A função HashBytes é capaz de aplicar um algoritmo de Hash sobre uma coluna do tipo VARCHAR, NVARCHAR ou VARBINARY e dispõe dos algoritmos MD2, MD4, MD5, SHA e SHA1. Embora seja possível implementar esse algoritmo através do CLR, a presença de uma função nativa é normalmente mais performática e evita esforço adicional de desenvolvimento e manutenção de código.

Respostas Incorretas: A, B, C

A – Se não houvesse uma função nativa que retorno o hash MD5, possivelmente o uso de uma CLR function seria o mais indicado. Entretanto, a presença de uma função nativa torna o uso do CLR desnecessário nesse caso.

B – O uso de uma stored procedure em CLR poderia ser utilizado para esse fim, mas normalmente uma função seria uma implementação mais indicada que uma stored procedure. Entretanto, a presença de uma função nativa dispensa o uso de uma stored procedure em CLR.

C – Um tipo de dados em CLR não é adequado nesse caso, visto que a aplicação de um algoritmo hash MD5 representa apenas um único método. Além do mais, a presença de uma função nativa dispensa o uso de CLR para esse fim.

[ ]s,

Gustavo

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

Oi Pessoal,

A última parte do simulado finalizou o tópico "Implementing Tables and Views". As próximas lições irão focar o tópico "Implementing Programming Objects" responsável por 16% das questões da prova.

Questão 022
Qual dos benefícios abaixo não pode ser obtido por uma stored procedure ?

A. Redução do tráfego de rede
B. Uso de outra linguagem que não o T-SQL
C. Melhorias na segurança do banco de dados
D. Facilidade de manutenção de código
E. Chamadas diretas a partir de um instruções SELECT locais
F. Melhorias de desempenho

Questão 023
A empresa ARB Importados possui uma aplicação de e-commerce em .NET. A aplicação grava pedidos de compras de equipamentos importados. Cada pedido possui um ou mais produtos a serem adquiridos conforme o modelo abaixo:

Quando um pedido é realizado, a aplicação grava um registro de pedido e em seguida, através de um loop, grava os produtos inclusos naquele pedido (no máximo cinco produtos por pedidos). Tanto a gravação do pedido quanto a gravação dos itens do pedido é feita através de stored procedures (uma para cada tabela). Você é um dos programadores da aplicação e lhe foi solicitado que apresentassem uma solução para que em uma única stored procedure fosse feita a inserção do pedido e de seus respectivos itens. Tanto o pedido quanto os itens seriam parâmetros de entrada dessa stored procedure. Qual seria a implementação mais adequada ?

A. Criação de uma stored procedure com todos os atributos de pedido e de cinco itens de pedido
B. Concatenação de todos os parâmetros em uma string delimitada por ponto e vírgula. Dentro da stored procedure haveria a separação dos parâmetros e inserção dos registros nas respectivas tabelas
C. Utilização de variáveis do tipo TABLE
D. Utilização de estruturas do tipo Table Value Parameter

Questão 024
Qual é a diferença entre parâmetros de saída (output parameters) e valores de retorno (return value) em stored procedures ?

A. O valor de retorno permite apenas o tipo INT enquanto parâmetros de saída podem trabalhar com outros tipos de dados
B. Só pode haver um único parâmetro de saída enquanto podem haver vários valores de retorno
C. Não há diferença entre eles. Ambos são sinônimos para um retorno de uma stored procedure
D. O parâmetro de saída será sempre um resultset enquanto que o valor de retorno é um tipo simples

Questão 025
A gerência de segurança da informação da empresa onde você trabalha como arquiteto está revendo as políticas de acesso a objetos de banco de dados. Embora o acesso das aplicações ao banco de dados seja apenas via stored procedures, há muitas permissões diretas em tabelas. Como parte de um esforço para melhoria da segurança de banco de dados, houve uma determinação de retirar todas as permissões diretas nas tabelas sempre que possível para evitar acesso a dados de forma não autorizada. Após retirar as permissões, uma determinada stored procedure apresentou o seguinte erro:

EXEC UspRecuperaRegistrosAleatorios @Quantidade = 10, @Tabela = ‘ModeloProposta’

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘ModeloProposta’, database ‘BDContas’, schema ‘FIN’.

A procedure UspRecuperaRegistros tem o seguinte código:

CREATE PROCEDURE UspRecuperaRegistrosAleatorios
   
@Quantidade INT,
   
@Tabela VARCHAR(50)
As
IF @Quantidade > 10
BEGIN
   
RAISERROR(‘Não é permitido escolher mais de 10 registros’,16,1)
   
RETURN
END

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = @tabela)
BEGIN
   
RAISERROR(‘Tabela Inexistente’,16,1)
   
RETURN
END

DECLARE @cmdSQL VARCHAR(200)
SET @cmdSQL = ‘SELECT TOP(‘ +
    CAST(@Quantidade As VARCHAR(4)) + ‘) * FROM ‘ + @Tabela + ‘ ORDER BY NEWID()’

EXEC(@cmdSQL)

Essa stored procedure normalmente é executada contra três principais tabelas (ModeloProposta, LancamentoContabil e EstornoContabil) para obter aleatoriamente até 10 registros de qualquer uma dessas tabelas pelo usuário UsrContab. De forma a obedecer as diretrizes de segurança, qual seria medida mais indicada para que o erro não ocorra ?

A. Criar um usuário a parte com acesso às tabelas ModeloProposta, LancamentoContabil e EstornoContabil. Incluir dentro da stored procedure a cláusula EXECUTE AS referenciando esse usuário.
B. Criar uma role e conceder permissão somente de SELECT nas tabelas ModeloProposta, LancamentoContabil e EstornoContabil.
C. Criar uma role e conceder permissão somente de SELECT nas tabelas ModeloProposta, LancamentoContabil e EstornoContabil. Incluir o usuário UsrContab na role.
D. Adicionar o usuário UsrContab à role db_datareader.

Questão 026
A empresa High Solutions LTDA o contratou como consultor de banco de dados para um projeto de revisão das implementações já realizadas. Há várias stored procedures de leitura de dados apresentando problemas aleatórios de lentidão. Ocorre que com determinados parâmetros ela produzem bons tempos de resposta, mas ao trocar os valores desses parâmetros os tempos de resposta aumentam drasticamente. Você suspeita que os planos de execução dessas stored procedures não estão adequados aos valores informados. Como parte do processo de análise dessas stored procedures, você deseja produzir um plano de execução para cada chamada da stored procedure. Qual das alternativas abaixo você deverá adotar para fazer isso ?

A. Preparar um script para executar todas as procedures com a clásula WITH RECOMPILE
B. Incluir a cláusula WITH RECOMPILE no corpo da stored procedure
C. Executar o comando sp_recompile ‘Procedure’ para cada stored procedure
D. Utilizar o comando ALTER PROCEDURE para cada stored procedure envolvida
E. Utilizar o HINT (WITH RECOMPILE) para cada comando dentro da stored procedure

Questão 027
Em um projeto de ERP que você está desenvolvendo surgiu a necessidade de criar uma função que verifique a quantidade em estoque de um determinado produto. O parâmetro de entrada dessa function será o ID do produto e o retorno deve ser a quantidade em estoque (INT). Qual o tipo de function que melhor atende à essa necessidade ?

A. InLine Function
B. MultiStatement Function
C. Table Valued Function
D. System Function
E. Scalar Function

Questão 028
Um determinado banco de dados possui três esquemas chamados FIN, RH e MKT e os donos desses esquemas são respectivamente os usuários UsrFin, UsrRH e UsrMKT. O esquema FIN possui uma tabela chamada PagamentoFuncionario e o usuário UsrRH tem permissão de SELECT nessa tabela. O usuário UsrRH criou uma function através do seguinte trecho de código:

CREATE FUNCTION RH.TotalPagoFunc (@IDFunc INT)
RETURNS MONEY
AS
BEGIN
    DECLARE
@Total MONEY
    SET @Total = (SELECT SUM(Salario) FROM FIN.PagamentoFuncionario
        WHERE IDFunc = @IDFunc)
    RETURN @Total
END

O usuário UsrRH testou a função e conseguiu utilizá-la adequadamente. Posteriormente, o usuário UsrRH concedeu permissão na function RH.TotalPagoFunc para o usuário UsrMKT. Quando o usuário UsrMKT tentou executar a função uma mensagem de erro foi retornada.

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘PagamentoFuncionario’, database ‘ERP’, schema ‘FIN’.

Segundo o princípio do menor privilégio, qual alternativa é a mais segura para fazer com que o usuário UsrMKT consiga retornar os dados da function ?

A. Conceder permissão de SELECT na tabela FIN.PagamentoFuncionario para o usuário UsrMKT
B. Incluir o usuário UsrMKT na role db_datareader
C. Incluir o usuário UsrMKT na role db_owner
D. Incluir no código da function a instrução WITH EXECUTE AS ‘UsrRH’
E. Tornar o usuário UsrRH dono do esquema FIN

Questão 029
Um desenvolvedor criou uma function com o seguinte código:

CREATE FUNCTION dbo.ListaVendas(@IDEmpregado INT)
RETURNS TABLE
AS RETURN
(SELECT * FROM Pedidos WHERE IDEmpregado = @IDEmpregado)

Como parte de uma série de testes unitários, você tentou executar um comando que referencia a function com o usuário UsrApp

SELECT * FROM dbo.ListaVendas(1)

Após a execução do comando, uma mensagem de erro é retornada:

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘ListaVendas’, database ‘Pedidos’, schema ‘dbo’.

Qual a instrução que deve ser executada para que você consiga efetuar o teste corretamente ?

A. REVOKE SELECT ON dbo.Pedidos TO UsrApp
B. GRANT SELECT ON dbo.Pedidos TO UsrApp
C. GRANT EXECUTE ON dbo.Pedidos TO UsrApp
D. GRANT SELECT ON dbo.ListaVendas TO UsrApp
E. GRANT EXECUTE ON dbo.ListaVendas TO UsrApp

Respostas

Questão 022
Qual dos benefícios abaixo não pode ser obtido por uma stored procedure ?

A. Redução do tráfego de rede
B. Uso de outra linguagem que não o T-SQL
C. Melhorias na segurança do banco de dados
D. Facilidade de manutenção de código
E. Chamadas diretas a partir de um instruções SELECT locais
F. Melhorias de desempenho

Resposta Correta: E

Embora as stored procedures permitam várias possibilidades, não é possível chamar uma stored procedure a partir de uma instrução SELECT local. Ex: SELECT <Campos> FROM <Stored Procedure>.

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

A – As stored procedures reduzem o tráfego de rede uma vez que que possibilitam as aplicações chamarem apenas a stored procedure em uma única instrução ao invés de codificar várias linhas de código para obter o retorno desejado diminuindo assim a quantidade de informação submetida ao banco de dados

B – A partir do SQL Server 2005 é possível utilizar linguagens compatíveis com o Framework .NET para desenvolvimento de stored procedures como o VB.NET, C#, F#, etc.

C – É possível conceder permissão de execução de uma stored procedure sem a necessidade de conceder permissão aos objetos por ela manipulados.

D – Se uma stored procedure for chamada em vários trechos de código de uma aplicação e (ou) por várias aplicações, é possível que uma mudança possa ser implementada apenas alterando-se o código da stored procedure evitando a mudança em vários locais, atividades de deploy, etc

F – A stored procedure quando executada pela primeira vez produz um plano de execução e o reproveita para as chamadas subsequentes (mesmo que haja mudança dos valores do parâmetros) evitando que uma nova chamada tenha de produzir o plano de execução novamente. Essa reutilização do plano de execução tende a melhor o desempenho.

Questão 023
A empresa ARB Importados possui uma aplicação de e-commerce em .NET. A aplicação grava pedidos de compras de equipamentos importados. Cada pedido possui um ou mais produtos a serem adquiridos conforme o modelo abaixo:

Quando um pedido é realizado, a aplicação grava um registro de pedido e em seguida, através de um loop, grava os produtos inclusos naquele pedido (no máximo cinco produtos por pedidos). Tanto a gravação do pedido quanto a gravação dos itens do pedido é feita através de stored procedures (uma para cada tabela). Você é um dos programadores da aplicação e lhe foi solicitado que apresentassem uma solução para que em uma única stored procedure fosse feita a inserção do pedido e de seus respectivos itens. Tanto o pedido quanto os itens seriam parâmetros de entrada dessa stored procedure. Qual seria a implementação mais adequada ?

A. Criação de uma stored procedure com todos os atributos de pedido e de cinco itens de pedido
B. Concatenação de todos os parâmetros em uma string delimitada por ponto e vírgula. Dentro da stored procedure haveria a separação dos parâmetros e inserção dos registros nas respectivas tabelas
C. Utilização de variáveis do tipo TABLE
D. Utilização de estruturas do tipo Table Value Parameter

Resposta Correta: D

Explicação: A estrutura Table Value Parameter permite que tabelas inteiras sejam passadas como parâmetros. Nesse caso pode-se criar uma tabela com o pedido e uma tabela com os itens daquele pedido e repassá-las como parâmetros. Ex:

CREATE TYPE Pedidos As TABLE (<Definições de estrutura>)
CREATE TYPE Itens As TABLE (<Definições de estrutura>)

CREATE PROCEDURE uspInserirPedidoCompleto (
  @Pedidos As Pedidos READONLY,
  @Itens As Itens READONLY)
As
     INSERT INTO Pedidos
     SELECT * FROM @Pedidos

     INSERT INTO Itens
     SELECT * FROM @Itens

Respostas Incorretas: A, B, C

A – Criar uma stored procedure com todos os atributos possíveis é uma solução muito trabalhosa. Os pedidos que tivessem dois itens teriam os demais atributos dos outros itens nulos. Outro problema seria validar os atributos realmente obrigatórios, pois, como a quantidade de itens é variável todos os parâmetros deveriam ser opcionais.

B – A concatenação de todos os parâmetros em uma string possui os mesmos problemas da stored procedure com os atributos de pedidos e de itens de pedido. Haverá preocupações adicionais em validar se os valores passados são do tipo correto e a montagem da lógica para recuperar todos os valores a partir da string.

C – Variáveis do tipo TABLE não podem ser utilizadas como parâmetros de entrada de uma stored procedure. Essa necessidade levou a criação de estruturas do tipo Table Value Parameter

Referências:
Algumas implementações multivaloradas com XML e Table Value Parameter – Parte I
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!1066.entry

Algumas implementações multivaloradas com XML e Table Value Parameter – Parte II
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!1067.entry

Questão 024
Qual é a diferença entre parâmetros de saída (output parameters) e valores de retorno (return value) em stored procedures ?

A. O valor de retorno permite apenas o tipo INT enquanto parâmetros de saída podem trabalhar com outros tipos de dados
B. Só pode haver um único parâmetro de saída enquanto podem haver vários valores de retorno
C. Não há diferença entre eles. Ambos são sinônimos para um retorno de uma stored procedure
D. O parâmetro de saída será sempre um resultset enquanto que o valor de retorno é um tipo simples

Resposta Correta: A

Explicação: Os valor de retorno retorna um tipo de dados inteiro que tem como valor padrão 0 caso não seja informado. O valor de retorno é definido através do comando RETURN que cessa a execução do código da stored procedure e retorna o valor especificado. O parâmetro de saída é um parâmetro presente no corpo da stored procedure assim como os parâmetros de entrada, mas é acompanhado da palavra OUTPUT. Como os parâmetros das stored procedures utilizam variáveis, o parâmetro de saída pode ser de outros tipos que não o INT.

Respostas Incorretas: B, C, D

B – Só pode haver um único valor de retorno, uma vez que qualquer comando RETURN irá cessar a execução da stored procedure. Caso a stored procedure não possua instrução de RETURN, automaticamente o valor de retorno será igual a zero. Já os parâmetros de uma stored procedure podem chegar 2100 e isso inclui os parâmetros de saída.

C – Embora o valor de retorno e os parâmetros de saída possam representar um retorno, eles não são sinônimos e possuem restrições diferentes. Normalmente o valor de retorno é utilizado para sinalizar um status de execução (ex: 0 – erro, 1 – sucesso) e os parâmetros de saída são utilizados para repassar algum valor como o último ID inserido, um valor criptografado, etc

D – O parâmetro de saída é representado através de variáveis e isso inclui tipos simples e não resultsets

Questão 025
A gerência de segurança da informação da empresa onde você trabalha como arquiteto está revendo as políticas de acesso a objetos de banco de dados. Embora o acesso das aplicações ao banco de dados seja apenas via stored procedures, há muitas permissões diretas em tabelas. Como parte de um esforço para melhoria da segurança de banco de dados, houve uma determinação de retirar todas as permissões diretas nas tabelas sempre que possível para evitar acesso a dados de forma não autorizada. Após retirar as permissões, uma determinada stored procedure apresentou o seguinte erro:

EXEC UspRecuperaRegistrosAleatorios @Quantidade = 10, @Tabela = ‘ModeloProposta’

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘ModeloProposta’, database ‘BDContas’, schema ‘FIN’.

A procedure UspRecuperaRegistros tem o seguinte código:

CREATE PROCEDURE UspRecuperaRegistrosAleatorios
   
@Quantidade INT,
   
@Tabela VARCHAR(50)
As
IF @Quantidade > 10
BEGIN
   
RAISERROR(‘Não é permitido escolher mais de 10 registros’,16,1)
   
RETURN
END

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = @tabela)
BEGIN
   
RAISERROR(‘Tabela Inexistente’,16,1)
   
RETURN
END

DECLARE @cmdSQL VARCHAR(200)
SET @cmdSQL = ‘SELECT TOP(‘ +
    CAST(@Quantidade As VARCHAR(4)) + ‘) * FROM ‘ + @Tabela + ‘ ORDER BY NEWID()’

EXEC(@cmdSQL)

Essa stored procedure normalmente é executada contra três principais tabelas (ModeloProposta, LancamentoContabil e EstornoContabil) para obter aleatoriamente até 10 registros de qualquer uma dessas tabelas pelo usuário UsrContab. De forma a obedecer as diretrizes de segurança, qual seria medida mais indicada para que o erro não ocorra ?

A. Criar um usuário a parte com acesso às tabelas ModeloProposta, LancamentoContabil e EstornoContabil. Incluir dentro da stored procedure a cláusula EXECUTE AS referenciando esse usuário.
B. Criar uma role e conceder permissão somente de SELECT nas tabelas ModeloProposta, LancamentoContabil e EstornoContabil.
C. Criar uma role e conceder permissão somente de SELECT nas tabelas ModeloProposta, LancamentoContabil e EstornoContabil. Incluir o usuário UsrContab na role.
D. Adicionar o usuário UsrContab à role db_datareader.

Resposta Correta: A

Explicação: A criação de instruções SQL dinâmicas faz com que o contexto de segurança seja revalidado e por isso, mesmo, que o usuário UsrContab tenha permissão na stored procedure, o fato de haver uma instrução SQL dinâmica fará com que esse usuário tenha a necessidade de ter permissões nos objetos utilizados, nesse caso as tabelas ModeloProposta, LancamentoContabil e EstornoContabil. A utilização da cláusula EXECUTE AS fará com que durante a execução da stored procedure um outro usuário seja utilizado, ou seja, o contexto de segurança da stored procedure será alterado apenas durante a  execução da stored procedure. Se esse outro usuário possuir permissão nas tabelas, a stored procedure ocorrerá normalmente sem a necessidade de concessão aos objetos. Após a execução da stored procedure o contexto de segurança voltará a ser do usuário UsrContab evitando assim que ele acesse as tabelas diretamente. Um código possível para essa implementação seria:

— Criação do Usuário
CREATE USER UsrRecuperaRegistros WITHOUT Login

— Concessão das permissões para o Usuário
GRANT SELECT ON ModeloProposta TO UsrRecuperaRegistros
GRANT SELECT ON LancamentoContabil TO UsrRecuperaRegistros
GRANT SELECT ON EstornoContabil TO UsrRecuperaRegistros

— Criação da Stored Procedure
CREATE PROCEDURE UspRecuperaRegistrosAleatorios
    @Quantidade INT,
    @Tabela VARCHAR(50)
WITH EXECUTE AS ‘UsrRecuperaRegistros’
As
IF @Quantidade > 10
BEGIN
    RAISERROR(‘Não é permitido escolher mais de 10 registros’,16,1)
    RETURN
END

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = @tabela)
BEGIN
    RAISERROR(‘Tabela Inexistente’,16,1)
    RETURN
END

DECLARE @cmdSQL VARCHAR(200)
SET @cmdSQL = ‘SELECT TOP(‘ +
    CAST(@Quantidade As VARCHAR(4)) +
    ‘) * FROM ‘ + @Tabela + ‘ ORDER BY NEWID()’

EXEC(@cmdSQL)

Respostas Incorretas: B, C, D

B – A criação de uma role sozinha não irá impedir que o erro ocorra uma vez que não há nenhuma associação entre a role e o contexto de segurança que executa a stored procedure

C – Essa medida irá resolver o erro, mas desobedecerá as diretrizes de segurança estabelecidas uma vez que será possível para o usuário UsrContab acessar as tabelas ModeloProposta, LancamentoContabil e EstornoContabil diretamente.

D – Essa medida irá resolver o erro, mas desobedecerá as diretrizes de segurança estabelecidas uma vez que será possível para o usuário UsrContab acessar as tabelas ModeloProposta, LancamentoContabil e EstornoContabil diretamente. Haverá ainda um risco adicional, pois, a role db_datareader permitirá ao usuário UsrContab o acesso irrestrito de leitura a qualquer tabela.

Questão 026
A empresa High Solutions LTDA o contratou como consultor de banco de dados para um projeto de revisão das implementações já realizadas. Há várias stored procedures de leitura de dados apresentando problemas aleatórios de lentidão. Ocorre que com determinados parâmetros ela produzem bons tempos de resposta, mas ao trocar os valores desses parâmetros os tempos de resposta aumentam drasticamente. Você suspeita que os planos de execução dessas stored procedures não estão adequados aos valores informados. Como parte do processo de análise dessas stored procedures, você deseja produzir um plano de execução para cada chamada da stored procedure. Qual das alternativas abaixo você deverá adotar para fazer isso ?

A. Preparar um script para executar todas as procedures com a clásula WITH RECOMPILE
B. Incluir a cláusula WITH RECOMPILE no corpo da stored procedure
C. Executar o comando sp_recompile ‘Procedure’ para cada stored procedure
D. Utilizar o comando ALTER PROCEDURE para cada stored procedure envolvida
E. Utilizar o HINT (WITH RECOMPILE) para cada comando dentro da stored procedure

Resposta Correta: B

Explicação: O uso da cláusula WITH RECOMPILE no corpo da stored procedure fará com que a cada execução, a stored procedure produza um novo plano de execução. Normalmente o reaproveitamento do plano de execução faz com que as stored procedures tenham desempenho superior a de consultas ADHOC, mas em determinadas situações, é possível que um único plano possa produzir bons resultados para um conjunto de valores e maus resultados para outros conjuntos de valores. Nessas situações, o uso da cláusula WITH RECOMPILE pode ser uma boa alternativa, mesmo que para cada chamada da stored procedure seja necessário produzir um plano de execução.

Respostas Incorretas: A, C, D, E

A – A execução de uma procedure com a cláusula WITH RECOMPILE fará com que aquela execução produza um novo plano de execução. Entretanto, as execuções subsequentes não irão produzir novos planos de execução senão estiverem com a cláusula WITH RECOMPILE. O script irá produzir novos planos na execução, mas as chamadas futuras das stored procedures não. É possível alterar todas as chamadas das stored procedures para incluir a cláusula WITH RECOMPILE. Ex: EXEC [Procedure] [Parâmetros] WITH RECOMPILE, mas isso representa um esforço de implementação desnecessário além de maiores custos de manutenção caso essa cláusula tenha de ser retirada.

C – O comando sp_recompile marca uma stored procedure para recompilação na próxima execução. Isso iria produzir um novo plano de execução apenas na próxima vez que a stored procedure for executada, as chamadas subsequentes não irão produzir novos planos de execução.

D – O comando ALTER PROCEDURE irá mudar a estrutura da stored procedure. Toda vez que a stored procedure é alterada (mesmo que a estrutura permaneça idêntica), ela produzirá um novo plano de execução na primeira vez que ela for chamada. Entretanto, as chamadas subsequentes irão reaproveitar o plano de execução que já foi gerado ao invés de gerar novos planos de execução.

E – O HINT WITH RECOMPILE é normalmente utilizado para consultas que possam provocar uma recompilação da stored procedure. Ao invés da stored procedure recompilar, apenas o comando será recompilado. Esse HINT é utilizado em nível de comando e não serve para recompilar stored procedures, mas apenas partes dela.

Questão 027
Em um projeto de ERP que você está desenvolvendo surgiu a necessidade de criar uma função que verifique a quantidade em estoque de um determinado produto. O parâmetro de entrada dessa function será o ID do produto e o retorno deve ser a quantidade em estoque (INT). Qual o tipo de function que melhor atende à essa necessidade ?

A. InLine Function
B. MultiStatement Function
C. Table Valued Function
D. System Function
E. Scalar Function

Resposta Correta: E

Explicação: As funções escalares (Scalar Functions) são capazes de receber um determinado valor e retonar um valor de estrutura simples (INT, VARCHAR, DATE, etc). Esse tipo de function é a adequada para receber um determinado ID de produto e retornar uma quantidade. Uma possível implementação seria:

CREATE FUNCTION dbo.RetornaEstoque(@IDProduto INT)
RETURNS INT
AS
BEGIN
    DECLARE
@QtdEstoque INT
    SET @QtdEstoque = (
        SELECT Estoque FROM Produto
        WHERE IDProduto = @IDProduto)

    RETURN @QtdEstoque
END

Respostas Incorretas: A, B, C, D

A – Uma função InLine recebe um parâmetro, mas retorna um ResultSet e não um valor. Ela poderia ser utilizada para retornar um ResultSet com a quantidade, embora não seja o tipo mais indicado.

B – Uma função MultiStatement tem o mesmo comportamento que a função Inline, embora ao contrário das funções InLine, as funções MultiStatement não estejam restritas a uma única consulta dentro do seu corpo. Embora seja possível utilizar um ResultSet com a quantidade, esse não é o tipo de function mais indicado para a necessidade estabelecida.

C – Table Value Functions representam todas as funções que retornem um ResultSet. As funções InLine e MultiStatement são Table Value Functions. Table Value Functions não retornam valores, mas sim ResultSets não sendo a implementação mais indicada.

D – Não é possível codificar uma System Function. Elas são nativas do SQL Server e não é permitido alterar as já existentes e nem criar novas.

Questão 028
Um determinado banco de dados possui três esquemas chamados FIN, RH e MKT e os donos desses esquemas são respectivamente os usuários UsrFin, UsrRH e UsrMKT. O esquema FIN possui uma tabela chamada PagamentoFuncionario e o usuário UsrRH tem permissão de SELECT nessa tabela. O usuário UsrRH criou uma function através do seguinte trecho de código:

CREATE FUNCTION RH.TotalPagoFunc (@IDFunc INT)
RETURNS MONEY
AS
BEGIN
    DECLARE
@Total MONEY
    SET @Total = (SELECT SUM(Salario) FROM FIN.PagamentoFuncionario
        WHERE IDFunc = @IDFunc)
    RETURN @Total
END

O usuário UsrRH testou a função e conseguiu utilizá-la adequadamente. Posteriormente, o usuário UsrRH concedeu permissão na function RH.TotalPagoFunc para o usuário UsrMKT. Quando o usuário UsrMKT tentou executar a função uma mensagem de erro foi retornada.

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘PagamentoFuncionario’, database ‘ERP’, schema ‘FIN’.

Segundo o princípio do menor privilégio, qual alternativa é a mais segura para fazer com que o usuário UsrMKT consiga retornar os dados da function ?

A. Conceder permissão de SELECT na tabela FIN.PagamentoFuncionario para o usuário UsrMKT
B. Incluir o usuário UsrMKT na role db_datareader
C. Incluir o usuário UsrMKT na role db_owner
D. Incluir no código da function a instrução WITH EXECUTE AS ‘UsrRH’
E. Tornar o usuário UsrRH dono do esquema FIN

Resposta Correta: D

Explicação: Como a tabela PagamentoEmpregado e a função TotalPagoFunc pertencem a esquemas diferentes e os donos (owners) desses esquemas são usuários diferentes, indiretamente o dono desses objetos não é o mesmo usuário. Se o dono dos objetos fosse o mesmo usuário, bastaria conceder a permissão de SELECT na function sem a necessidade de conceder a permissão de SELECT na tabela. Como os donos são diferentes, cada vez que a função é executada, as permissões na tabela FIN.Lancamentos são checadas. Como o usuário UsrRH possui permissão nessa tabela, ao executar a função não haverá erros de permissionamento. No caso do usuário UsrMKT, esse possui permissão apenas na function TotalPagoFunc, mas não possui permissão na tabela FIN.PagamentoFuncionario e por isso a mensagem de erro aparece. O uso da cláusula EXECUTE AS na function fará com que o contexto de segurança seja do usuário UsrRH independente de quem execute a função. Assim, quando o usuário UsrMKT executar a função, durante a execução, ele se passará pelo usuário UsrRH e conseguirá recuperar os dados. Após a execução da função, as credenciais voltam a ser do usuário UsrMKT, porém os dados foram recuperados corretamente.

Respostas Incorretas: A, B, C, E

A – A concessão de SELECT na tabela FIN.PagamentoFuncionario para o usuário UsrMKT permitirá que esse execute a function corretamente, mas concederá a esse a possibilidade de acessar a tabela FIN.PagamentoFuncionario diretamente incorrendo em problemas de segurança já que o usuário UsrMKT terá mais permissões do que o necessário para executar a function.

B – A inclusão do usuário UsrMKT na role db_datareader permitirá que ele acesse a tabela FIN.PagamentoFuncionario, mas concederá permissão para ler qualquer tabela. A mensagem de erro não irá mais aparecer, mas haverá um risco adicional de segurança já que o usuário UsrMKT terá mais privilégios do que o mínimo necessário para executar a função.

C – A inclusão do usuário UsrMKT na role db_owner permitirá que ele acesse a tabela FIN.PagamentoFuncionario, mas concederá permissão para efetuar qualquer operação no banco de dados. A mensagem de erro não irá mais aparecer, mas haverá um risco adicional de segurança já que o usuário UsrMKT terá mais privilégios do que o mínimo necessário para executar a função.

E – Se o usuário UsrMKT tornar-se dono do esquema FIN ele automaticamente terá acesso a tabela FIN.PagamentoFuncionario e conseguirá executar a função corretamente. Entretanto, ele terá acesso completo a todos os objetos desse esquema e portanto, mais privilégios do que o mínimo necessário para executar a function.

Questão 029
Um desenvolvedor criou uma function com o seguinte código:

CREATE FUNCTION dbo.ListaVendas(@IDEmpregado INT)
RETURNS TABLE
AS RETURN
(SELECT * FROM Pedidos WHERE IDEmpregado = @IDEmpregado)

Como parte de uma série de testes unitários, você tentou executar um comando que referencia a function com o usuário UsrApp

SELECT * FROM dbo.ListaVendas(1)

Após a execução do comando, uma mensagem de erro é retornada:

Msg 229, Level 14, State 5, Line 1
The SELECT permission was denied on the object ‘ListaVendas’, database ‘Pedidos’, schema ‘dbo’.

Qual a instrução que deve ser executada para que você consiga efetuar o teste corretamente ?

A. REVOKE SELECT ON dbo.Pedidos TO UsrApp
B. GRANT SELECT ON dbo.Pedidos TO UsrApp
C. GRANT EXECUTE ON dbo.Pedidos TO UsrApp
D. GRANT SELECT ON dbo.ListaVendas TO UsrApp
E. GRANT EXECUTE ON dbo.ListaVendas TO UsrApp

Resposta Correta: D

Explicação: A mensagem mostra que uma permissão de SELECT é requerida sobre a função ListaVendas. O uso do comando GRANT concede a permissão de SELECT sobre a function ListaVendas e é necessário para que o teste seja concluído corretamente.

Respostas Incorretas: A, B, C, E

A – O comando REVOKE é utilizada para revogar permissões e não para concedê-las

B – Embora a função faça uma consulta sobre a tabela de Pedidos, a mensagem de erro mostra a ausência de permissão na função ListaVendas e não na tabela Pedidos.

C – Embora a função faça uma consulta sobre a tabela de Pedidos, a mensagem de erro mostra a ausência de permissão na função ListaVendas e não na tabela Pedidos. Adicionalmente a permissão correta é de SELECT e não de EXECUTE.

E – A função ListaVendas é do tipo InLine Function e retorna um ResultSet. Para que a mensagem referente ao erro de permissão não apareça, é necessário que a permissão de SELECT seja concedida e não a permissão de EXECUTE. A permissão de EXECUTE é necessária quando a function é do tipo Scalar Function o que não é o caso.

[ ]s,

Gustavo

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

Boa Noite Pessoal,

Dando continuidade ao simulado preparatório para a prova 70-433, hoje postarei mais questões para auxiliar na prova. Essa segunda parte abordará 11 questões finalizando o primeiro tópico "Implementing Tables and Views" responsável por 14% das questões da prova.

Questão 011
Você é o administrador de dados de uma empresa de planos de saúde. A empresa está elaborando um novo sistema de CRM e a identificação dos clientes obedece às seguintes regras:

  1. Os clientes devem ser identificados por um número gerado automaticamente (CodigoCliente)
  2. Haverá no máximo 5 milhões de clientes
  3. Os clientes possuem RG e esse é um atributo único e obrigatório
  4. Os clientes possuem CPF e esse é um campo único porém opcional

A tabela de clientes foi implementada conforme a figura abaixo:

Tendo por base as regras estipuladas e a tabela em questão, quais das alternativas devem ser implementadas de forma a manter a integridade lógica dos dados ? (Marque todas que se aplicam)

A. A coluna CodigoCliente deve ser do tipo UniqueIdentifier
B. A coluna CodigoCliente deve ser do tipo INT
C. A coluna CodigoCliente deve ter a propriedade Is Identity marcada como verdadeira
D. A coluna CodigoCliente deve ter um valor Default NewSequentialID()
E. A coluna CodigoCliente deve compor a Primary Key
F. A coluna CodigoCliente deve ter uma Unique Constraint
G. A coluna RG deve compor a Primary Key
H. A coluna RG deve ter uma Unique Constraint
I. A coluna CPF deve compor a Primary Key
J. A coluna CPF deve ter uma Unique Constraint

Questão 012
O implementador de banco de dados criou uma tabela de Clientes com a opção conforme a figura abaixo:

O script de criação da tabela está detalhado a seguir:

SET ANSI_NULL_DFLT_ON
GO

CREATE TABLE Clientes (
    IdCliente INT PRIMARY KEY, NomeCliente VARCHAR(50),
    Renda SMALLMONEY, CPF CHAR(11))
GO

A tabela possui uma CHECK Constraint e uma trigger AFTER. O código da CHECK Constraint é exibido abaixo:

ALTER TABLE Clientes ADD CONSTRAINT CKRenda CHECK (Renda > 0)

A CHECK Constraint verifica se a coluna Renda é maior que zero e a trigger faz um registro em uma tabela de auditoria informando o nome do operador que cadastrou o cliente. Um operador iniciante fez dois cadastros. No primeiro cadastro ele informou a renda igual a zero e no segundo a renda nula. Marque todas as alternativas corretas:

A. Ocorrerá um erro nos dois cadastros, mas a trigger irá disparar em ambos
B. Ocorrerá um erro nos dois cadastros e a trigger não irá disparar em nenhum deles
C. O 1º cadastro será rejeitado e o 2º permitido e haverá disparo da trigger nos dois cadastros
D. O 1º cadastro será permitido e o 2º rejeitado e haverá disparo da trigger nos dois cadastros
E. O 1º cadastro irá falhar e a trigger não será disparada. O segundo cadastro será feito normalmente com disparo da trigger.

Questão 013
No banco de dados do principal sistema desenvolvido pela equipe a qual você faz parte, há uma tabela que foi criada conforme o código a seguir:

CREATE TABLE Equipamentos (
    IDEquipamento INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    NomeEquipamento VARCHAR(60) NOT NULL,
    IDCategoria INT NOT NULL)

A tabela encontra-se vazia e servirá para um novo módulo de contabilidade. Você possui a lista de equipamentos em outra tabela e gostaria de fazer a carga para a tabela Equipamentos através do comando abaixo:

INSERT INTO Equipamentos (IDEquipamento, NomeEquipamento, IDCategoria)
SELECT ID, Nome, IDCat FROM EquipamentosOLD

Ao rodar esse comando a seguinte mensagem de erro referente ao uso do Identity foi apresentada.

Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table ‘Equipamentos’ when IDENTITY_INSERT is set to OFF.

Qual comando deveria ser executado antes do INSERT ?

A. ALTER TABLE Equipamentos SET IDENTITY OFF
B. DBCC CHECKIDENT(‘Equipamentos’,RESEED,0)
C. SET IDENTITY_INSERT Equipamento ON
D. EXEC sp_tableoption ‘Equipamentos’,‘Disable Identity’

Questão 014
Como responsável pela camada de persistência de um aplicativo de pedidos, você ficou responsável por definir uma implementação para um relacionamento de composição entre duas classes "Pedidos" e "Item". O objetivo é que caso um determinado pedido seja excluído, seus itens também sejam automaticamente excluídos. O diagrama das tabelas é exposto abaixo:

Levando em consideração a necessidade exposta e a presença de aplicativos legados que não irão necessariamente utilizar a persistência definida por você, qual seria a melhor implementação ?

A. Utilizar uma Stored Procedure para efetuar a exclusão dos Itens e depois do Pedido
B. Habilitar a exclusão em cascata na chave estrangeira na tabela de Itens
C. Utilizar uma trigger Instead Of Delete na tabela de Pedidos para excluir os itens e depois o Pedido
D. Não há necessidade de implementar esse controle, pois, por padrão ao excluir um Pedido seus itens serão automaticamente excluídos.

Questão 015
Como programador recém contratado, você está efetuando manutenção em uma aplicação de protocolo da instituição. Todo documento possui duas datas respectivamente a data do documento e a data do primeiro despacho:

A regra de negócio diz que não é possível que um documento possa ser despachado antes dele ter sido criado, ou seja, a data de despacho tem de ser superior à data de cadastro.

Ao implementar um CHECK Constraint para garantir essa regra, você percebeu que ela não pôde ser implementada, pois, havia vários registros onde a data de criação do documento era superior a data do primeiro despacho. Você necessita implementar essa regra, pois, se a mesma não for implementada, mais registros podem ter a data de cadastro superior à data do primeiro despacho. O que você deve fazer ?

A. Implementar uma trigger AFTER INSERT para controlar os novos documentos
B. Implementar uma trigger INSTEAD OF INSERT para controlar os novos documentos
C. Deixar a cargo da aplicação a realização desse controle
D. Implementar a CHECK CONSTRAINT com a cláusula WITH NOCHECK e em seguida habilitá-la

Questão 016
A empresa onde você trabalha está desenvolvimento uma aplicação para catalogar as fotos e os vídeos de eventos relacionados a empresa. As fotos têm um tamanho médio de 1MB enquanto os vídeos ficam em 20MB. A aplicação não deverá guardar os dados diretamente no banco de dados e é necessário ter as seguintes garantias:

  • Quando um backup da base for executado, as fotos e os vídeos devem fazer parte do backup
  • Quando um registro for excluído, automaticamente os arquivos associados devem ser excluídos
  • O esforço de desenvolvimento e administração deve ser o menor possível

Qual seria a melhor implementação no banco de dados ?

A. Gravar os arquivos em uma coluna do tipo VARBINARY(20)
B. Gravar os arquivos em uma coluna do tipo VARBINARY(MAX)
C. Utilizar o tipo de dados FILESTREAM
D. Gravar todos os arquivos em uma pasta e gravar no banco de dados apenas o caminho dos arquivos em uma coluna VARCHAR e utilizar a aplicação recuperar o arquivo

Questão 017
Qual das instruções abaixo instancia um tipo de dados geométrico definindo um ponto nas coordenadas 11, 14 ?

A. DECLARE @g geometry;
SET @g = geometry::STPointFromText(‘POINT (11 14)’);
B. DECLARE @g geometry ;
SET @g = geometry::STPointFromText(‘(11 14)’, 0);
C. DECLARE @g geography;
SET @g = geometry::STPointFromText(‘POINT (11 14)’, 0);
D. DECLARE @g geometry ;
SET @g = geometry::STPointFromText(‘POINT (11 14)’, 0);

Questão 018
Após efetuar um deploy para o ambiente de produção, os usuários se queixam de uma mensagem de erro “Cannot resolve collation conflict for equal to operation”. A equipe de produção mapeou a tela de erro que possibilitou encontrar a consulta que provocou o erro.

SELECT
     Atual.CentroCusto + ‘ – ‘ + Atual.NomeArea As Area,
     Atual.Valor As CustoAtual, YEAR(Atual.DataRef) As AnoCorrente,
     YEAR(Antigo.DataRef) As AnoBase, Antigo.Valor As CustoAntigo
FROM Dados2010.dbo.Faturamento As Atual
     LEFT OUTER JOIN Dados2009.dbo.Faturamento As Antigo ON Atual.CentroCusto = Old.CentroCusto

Qual é a provável causa do problema ?

A. A coluna CentroCusto possui a collation diferente da coluna NomeArea
B. A coluna DataRef é Unicode
C. O LEFT OUTER JOIN deve ser substituído por INNER JOIN
D. A collation da base Dados2009 deve ser diferente da collation da base Dados2010
E. A collation das colunas CentroCusto deve estar diferente entre as bases de dados

Questão 019
Quais os dois comandos da lista abaixo são capazes de mostrar a collation de um banco de dados específico ?

A. SELECT SERVERPROPERTY(‘Collation’)
B. SELECT DATABASEPROPERTYEX(‘<Banco>’,‘Collation’ )
C. EXEC sp_helpdb ‘<Banco>’
D. SELECT Collation FROM sys.databases WHERE name = ‘<Banco>’
E. SELECT * FROM ::fn_helpcollations()
F. SELECT Collation FROM INFORMATION_SCHEMA.DATABASES WHERE name = ‘<Banco>’

Questão 020
A relação abaixo lista alguns dos passos envolvidos na criação de uma tabela particionada.

1. Criação do esquema de particionamento
2. Criação da tabela
3. Criação dos arquivos adicionais de dados
4. Criação dos FILEGROUPs
5. Criação da função de particionamento

Qual das sequências a seguir pode ser utilizada para criar uma tabela particionada ?

A. 1, 5, 4, 3, 2
B. 4, 3, 5, 1, 2
C. 3, 4, 5, 1, 2
D. 3, 4, 1, 5, 2
E. 5, 4, 2, 1, 3

Questão 021
Você é um implementador de banco de dados e está desenvolvendo um função de particionamento com o seguinte código:

CREATE PARTITION FUNCTION pf_Data (DATETIME2)
AS RANGE LEFT FOR VALUES (‘20080101’,‘20090101’,‘20100101’);

Os valores 01/01/2008 e 01/01/2009 00:30 ficarão respectivamente em quais partições ?

A. 1 e 2
B. 2 e 3
C. 1 e 3
D. Ambos ficarão na partição 2


Respostas

Questão 011
Você é o administrador de dados de uma empresa de planos de saúde. A empresa está elaborando um novo sistema de CRM e a identificação dos clientes obedece às seguintes regras:

  1. Os clientes devem ser identificados por um número gerado automaticamente (CodigoCliente)
  2. Haverá no máximo 5 milhões de clientes
  3. Os clientes possuem RG e esse é um atributo único e obrigatório
  4. Os clientes possuem CPF e esse é um campo único porém opcional

A tabela de clientes foi implementada conforme a figura abaixo:

Tendo por base as regras estipuladas e a tabela em questão, quais das alternativas devem ser implementadas de forma a manter a integridade lógica dos dados ? (Marque todas que se aplicam)

A. A coluna CodigoCliente deve ser do tipo UniqueIdentifier
B. A coluna CodigoCliente deve ser do tipo INT
C. A coluna CodigoCliente deve ter a propriedade Is Identity marcada como verdadeira
D. A coluna CodigoCliente deve ter um valor Default NewSequentialID()
E. A coluna CodigoCliente deve compor a Primary Key
F. A coluna CodigoCliente deve ter uma Unique Constraint
G. A coluna RG deve compor a Primary Key
H. A coluna RG deve ter uma Unique Constraint
I. A coluna CPF deve compor a Primary Key
J. A coluna CPF deve ter uma Unique Constraint

Respostas Corretas: B, C, E, H

Explicação: A regra 1 diz que os clientes devem ser identificados por um número gerado automaticamente e a regra 2 diz que haverá no máximo 5 milhões de clientes. Essa quantidade é suportável pelo tipo INT. Para que um número possa ser gerado automaticamente basta que essa coluna tenha a propriedade Is Identity marcada como verdadeira. A regra 3 diz que os clientes devem ser identificados pela atributo CodigoCliente e portanto ela deve ser compor a chave primária (Primary Key). Como o atributo RG é único e obrigatório é necessário obrigar que o mesmo não se repita para manter a integridade. Como a identificação dos clientes é feita com base no código (chave primária), o RG será uma chave alternativa e deve portanto ter um Unique Constraint associada.

Respostas Incorretas: A, D, F, G, I, J

A – A regra 1 estipula que um número deva identificar o cliente. Essa regra já descarta o tipo UniqueIdentifier, pois, esse representa um GUID (Global Unique Identifier) e não consiste em um número.

D – Um valor Default NewSequentialID () provê um UniqueIdentifier de forma sequencial, mas uma vez que o tipo de dados não é UniqueIdentifier, esse valor Default não pode ser utilizado.

F – A coluna CodigoCliente já é chave primária e não há necessidade de adicionar uma Unique Constraint a essa coluna.

G – A coluna RG poderia compor a chave primária, mas como a regra 1 diz que os clientes são identificados pelo código, a coluna CodigoCliente deve ser a chave primária e não o RG.

I – A coluna CPF não pode compor uma chave primária, uma vez que a chave primária não comporta valores nulos.

J – A coluna CPF é única, mas como as Unique Constraints no SQL Server só toleram uma única ocorrência de valor nulo, não é possível utilizá-la na coluna CPF.

Referências:
Unique Constraints – Aplicações, Alternativas e um lapso "justificável" do SQL Server
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!710.entry

Questão 012
O implementador de banco de dados criou uma tabela de Clientes com a opção conforme a figura abaixo:

O script de criação da tabela está detalhado a seguir:

SET ANSI_NULL_DFLT_ON
GO

CREATE TABLE Clientes (
    IdCliente INT PRIMARY KEY, NomeCliente VARCHAR(50),
    Renda SMALLMONEY, CPF CHAR(11))
GO

A tabela possui uma CHECK Constraint e uma trigger AFTER. O código da CHECK Constraint é exibido abaixo:

ALTER TABLE Clientes ADD CONSTRAINT CKRenda CHECK (Renda > 0)

A CHECK Constraint verifica se a coluna Renda é maior que zero e a trigger faz um registro em uma tabela de auditoria informando o nome do operador que cadastrou o cliente. Um operador iniciante fez dois cadastros. No primeiro cadastro ele informou a renda igual a zero e no segundo a renda nula. Marque todas as alternativas corretas:

A. Ocorrerá um erro nos dois cadastros, mas a trigger irá disparar em ambos
B. Ocorrerá um erro nos dois cadastros e a trigger não irá disparar em nenhum deles
C. O 1º cadastro será rejeitado e o 2º permitido e haverá disparo da trigger nos dois cadastros
D. O 1º cadastro será permitido e o 2º rejeitado e haverá disparo da trigger nos dois cadastros
E. O 1º cadastro irá falhar e a trigger não será disparada. O segundo cadastro será feito normalmente com disparo da trigger.

Resposta Correta: E

Explicação: As triggers AFTER são disparados após o evento de origem ter sido executado. Se uma CONSTRAINT for violada (PK, FK, NOT NULL, Check, etc) o evento não será concluído e por isso uma trigger AFTER não será disparada. No caso do 1º cadastro a renda é igual a zero e portanto a Check Constraint é violada. Essa violação irá impedir que o registro seja inserido e a trigger não será disparada. No caso do 2º cadastro, a renda nula é permitida, pois, por padrão CHECK Constraint não rejeitam registros nulos (a menos que se coloque essa restrição na especificação da CHECK Constraint). O uso da opção SET ANSI_NULL_DFLT_ON garante que a coluna foi criada de forma a permitir valores nulos e portanto o 2º registro será considerado válido. Uma vez que o registro foi realizado sem violar constraints, a trigger será disparada para o 2º cadastro.

Respostas Incorretas: A, B, C, D 

A – Uma trigger AFTER não é disparada se ocorrer um erro no cadastro

B – Não ocorrerá um erro no segundo cadastro visto que a opção SET ANSI_NULL_DFLT_ON criou a coluna Renda de forma a permitir registros nulos e a constraint não faz nenhuma restrição. Só haveria erro no segundo cadastro se a coluna não permitisse valores nulos.

C – O segundo cadastro não será rejeitado

D – Não haverá disparo de trigger no primeiro cadastro, pois, como a renda informada é igual a zero a CHECK Constraint é violada e o INSERT não ocorrerá.

Questão 013
No banco de dados do principal sistema desenvolvido pela equipe a qual você faz parte, há uma tabela que foi criada conforme o código a seguir:

CREATE TABLE Equipamentos (
    IDEquipamento INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    NomeEquipamento VARCHAR(60) NOT NULL,
    IDCategoria INT NOT NULL)

A tabela encontra-se vazia e servirá para um novo módulo de contabilidade. Você possui a lista de equipamentos em outra tabela e gostaria de fazer a carga para a tabela Equipamentos através do comando abaixo:

INSERT INTO Equipamentos (IDEquipamento, NomeEquipamento, IDCategoria)
SELECT ID, Nome, IDCat FROM EquipamentosOLD

Ao rodar esse comando a seguinte mensagem de erro referente ao uso do Identity foi apresentada.

Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table ‘Equipamentos’ when IDENTITY_INSERT is set to OFF.

Qual comando deveria ser executado antes do INSERT ?

A. ALTER TABLE Equipamentos SET IDENTITY OFF
B. DBCC CHECKIDENT(‘Equipamentos’,RESEED,0)
C. SET IDENTITY_INSERT Equipamento ON
D. EXEC sp_tableoption ‘Equipamentos’,‘Disable Identity’

Resposta Correta: C

Explicação: Por padrão uma coluna Identity gera valores automaticamente. A instrução SET IDENTITY_INSERT permite que valores explícitos sejam inseridos em uma coluna mesmo que ela esteja marcada como Identity.

Respostas Incorretas: A, B, D

A – Esse comando não existe no SQL Server

B – O comando DBCC CHECKIDENT serve para verificar e atribuir um novo valor inicial para o Identity, mas não irá permitir que ele seja sobrescrito.

D – A opção Disable Identity não é um parâmetro válido para a stored procedure sp_tableoption

Questão 014
Como responsável pela camada de persistência de um aplicativo de pedidos, você ficou responsável por definir uma implementação para um relacionamento de composição entre duas classes "Pedidos" e "Item". O objetivo é que caso um determinado pedido seja excluído, seus itens também sejam automaticamente excluídos. O diagrama das tabelas é exposto abaixo:

Levando em consideração a necessidade exposta e a presença de aplicativos legados que não irão necessariamente utilizar a persistência definida por você, qual seria a melhor implementação ?

A. Utilizar uma Stored Procedure para efetuar a exclusão dos Itens e depois do Pedido
B. Habilitar a exclusão em cascata na chave estrangeira na tabela de Itens
C. Utilizar uma trigger Instead Of Delete na tabela de Pedidos para excluir os itens e depois o Pedido
D. Não há necessidade de implementar esse controle, pois, por padrão ao excluir um Pedido seus itens serão automaticamente excluídos.

Resposta Correta: B

Explicação: Por padrão, um exclusão em uma tabela que seja referenciada por outras tabelas não é possível se houver registros correspondentes. Isso significa que a exclusão de um pedido que possua itens não será possível, pois, ela deixaria referências incorretas nos itens do pedido excluído. A especificação ANSI especifica algumas ações que podem ser configuradas nessa situação. A ação padrão (No Action) é impedir a exclusão na presença de correspondentes. Existem ainda as opções Cascade, Set Default e Set Null. A opção Cascade faz a exclusão em cascata fazendo com que a exclusão de um pedido automaticamente exclua os itens correspondentes.

Respostas Incorretas: A, C, D

A – Uma stored procedure incorreria em mais codificação e não faria a exclusão automática caso alguma aplicação legada fizesse um DELETE diretamente contra a tabela sem utilizá-la.

C – Essa poderia ser uma implementação válida, mas triggers incorrem em menos desempenho e mais codificação que a mudança na chave estrangeira.

D – A exclusão em cascata não é a opção padrão.

Questão 015
Como programador recém contratado, você está efetuando manutenção em uma aplicação de protocolo da instituição. Todo documento possui duas datas respectivamente a data do documento e a data do primeiro despacho:

A regra de negócio diz que não é possível que um documento possa ser despachado antes dele ter sido criado, ou seja, a data de despacho tem de ser superior à data de cadastro.

Ao implementar um CHECK Constraint para garantir essa regra, você percebeu que ela não pôde ser implementada, pois, havia vários registros onde a data de criação do documento era superior a data do primeiro despacho. Você necessita implementar essa regra, pois, se a mesma não for implementada, mais registros podem ter a data de cadastro superior à data do primeiro despacho. O que você deve fazer ?

A. Implementar uma trigger AFTER INSERT para controlar os novos documentos
B. Implementar uma trigger INSTEAD OF INSERT para controlar os novos documentos
C. Deixar a cargo da aplicação a realização desse controle
D. Implementar a CHECK CONSTRAINT com a cláusula WITH NOCHECK e em seguida habilitá-la

Resposta Correta: D

Explicação: Toda vez que uma constraint é criada ela fará a checagem dos valores previamente cadastrados para verificar se eles obedecem a regra estipulada pela constraint. Caso algum registro não esteja em conformidade com as regras definidas pela constraint, a criação da mesma falha. No caso de CHECK Constraints e Foreign Keys é possível mudar esse comportamento criando-os com a cláusula NOCHECK. Isso faz com que elas sejam criadas mesmo que haja registros que violem suas regras. Ao habilitá-las apenas os novos registros são checados. Os registros anteriores à sua criação não são verificados.

Respostas Incorretas: A, B, C

A, B – O uso de triggers possibilita a criação das regras, mas são menos performáticos que uma constraint e portanto não são a melhor alternativa.

C – Implementar a regra na aplicação é uma alternativa, mas se por ventura mais aplicações gravarem registros nessa tabela, a regra terá de ser repetida em cada aplicação. Outro inconveniente é que gravações feitas diretamente na base de dados e (ou) cargas de dados não serão verificadas.

Questão 016
A empresa onde você trabalha está desenvolvimento uma aplicação para catalogar as fotos e os vídeos de eventos relacionados a empresa. As fotos têm um tamanho médio de 1MB enquanto os vídeos ficam em 20MB. A aplicação não deverá guardar os dados diretamente no banco de dados e é necessário ter as seguintes garantias:

  • Quando um backup da base for executado, as fotos e os vídeos devem fazer parte do backup
  • Quando um registro for excluído, automaticamente os arquivos associados devem ser excluídos
  • O esforço de desenvolvimento e administração deve ser o menor possível

Qual seria a melhor implementação no banco de dados ?

A. Gravar os arquivos em uma coluna do tipo VARBINARY(20)
B. Gravar os arquivos em uma coluna do tipo VARBINARY(MAX)
C. Utilizar o tipo de dados FILESTREAM
D. Gravar todos os arquivos em uma pasta e gravar no banco de dados apenas o caminho dos arquivos em uma coluna VARCHAR e utilizar a aplicação recuperar o arquivo

Resposta Correta: C

Explicação: O tipo de dados FILESTREAM permite a gravação de imagens, vídeos, arquivos, etc no SQL Server. Ao utilizar esse tipo de dados, os arquivos não ficam armazenados juntamente com os dados em arquivos MDF e NDF, mas sim no sistema de arquivos podendo ser acessados inclusive por outras aplicações (se devidamente configurado). Essa funcionalidade permite que se obtenha os benefícios do armazenamento em sistema de arquivos (desempenho, acesso, etc) sem abrir mão dos benefícios de banco de dados (backup, segurança integrada, etc).

Respostas Incorretas: A, B, D

A – Uma coluna do tipo VARBINARY(20) não tem o tamanho necessário para armazenar as fotos e os vídeos, pois, possui no máximo 20 bytes de tamanho.

B – A coluna do tipo VARBINARY(MAX) permite o armazenamento de dados binários em até 2GB e atende aos requisitos de tamanho. Entretanto, os dados serão armazenados diretamente no banco de dados juntamente com as demais tabelas, índices, etc e não atenderia a necessidade de não gravar os dados diretamente no banco de dados.

D – A gravação dos arquivos fora do banco de dados e apenas o caminho no banco de dados é uma solução performática, mas tem algumas desvantagens. O backup do banco de dados representará apenas os dados e não contemplará o backup dos arquivos e vice-versa. A exclusão de um registro não incorrerá automaticamente na exclusão dos arquivos referentes aquele registro. Embora seja possível contornar essas desvantagens através da aplicação, procedimentos, etc isso representa esforços adicionais na codificação da aplicação e nas tarefas administrativas.

Questão 017
Qual das instruções abaixo instancia um tipo de dados geométrico definindo um ponto nas coordenadas 11, 14 ?

A. DECLARE @g geometry;
SET @g = geometry::STPointFromText(‘POINT (11 14)’);
B. DECLARE @g geometry ;
SET @g = geometry::STPointFromText(‘(11 14)’, 0);
C. DECLARE @g geography;
SET @g = geometry::STPointFromText(‘POINT (11 14)’, 0);
D. DECLARE @g geometry ;
SET @g = geometry::STPointFromText(‘POINT (11 14)’, 0);

Resposta Correta: D

Explicação: O tipo de dados geometry possui o método STPointFromText que permite definir as coordenadas de um ponto específico (Point) ou vários pontos (Multipoint). Esse método recebe dois argumentos. O primeiro é a coleção das coordenadas geométricas e o segundo é o SRID (Spatial Reference ID).

Respostas Incorretas: A, B, C

A – O método STPointFromText obriga que o SRID seja informado. Como o SRID foi omitido um erro de sintaxe será gerado.

B – O método STPointFromText obriga que a coleção das coordenadas geométricas informe se será apenas um ponto (Point) ou vários pontos (Multi Point). Não é possível especificar somente as coordenadas.

C – A variável @g foi declarada como geográfica e não geométrica e o uso do método STPointFromText não funciona para tipos geográficos.

Questão 018
Após efetuar um deploy para o ambiente de produção, os usuários se queixam de uma mensagem de erro “Cannot resolve collation conflict for equal to operation”. A equipe de produção mapeou a tela de erro que possibilitou encontrar a consulta que provocou o erro.

SELECT
     Atual.CentroCusto + ‘ – ‘ + Atual.NomeArea As Area,
     Atual.Valor As CustoAtual, YEAR(Atual.DataRef) As AnoCorrente,
     YEAR(Antigo.DataRef) As AnoBase, Antigo.Valor As CustoAntigo
FROM Dados2010.dbo.Faturamento As Atual
     LEFT OUTER JOIN Dados2009.dbo.Faturamento As Antigo ON Atual.CentroCusto = Old.CentroCusto

Qual é a provável causa do problema ?

A. A coluna CentroCusto possui a collation diferente da coluna NomeArea
B. A coluna DataRef é Unicode
C. O LEFT OUTER JOIN deve ser substituído por INNER JOIN
D. A collation da base Dados2009 deve ser diferente da collation da base Dados2010
E. A collation das colunas CentroCusto deve estar diferente entre as bases de dados

Resposta Correta: E

Explicação: A collation representa como os dados de um tipo textual (varchar, char, nvarchar, nchar, text e ntext) são comparados e ordenados. Como a mensagem de erro relata problemas com a collation, deve necessariamente haver comparações entre colunas textuais. A consulta mostra apenas duas combinações entre colunas (Atual.CentroCusto + ‘ – ‘ + Atual.NomeArea e Atu.CentroCusto = Old.CentroCusto). A parte final da mensagem tem o texto “for equal to operation” que informa que o erro ocorre em uma comparação de igualdade. Como a única comparação que envolve igualdade refere-se às colunas de centro de custo, possivelmente a collation dessas colunas não é a mesma.

Respostas Incorretas: A, B, C, D

A – A concatenação de duas colunas com collation diferente pode produzir um erro de collation, mas nesse caso a mensagem de erro seria “Implicit conversion of varchar value to varchar cannot be performed because the collation of the value is unresolved due to a collation conflict.”

B – O fato de uma coluna ser Unicode não necessariamente provocará um erro de collation. Apenas se houver combinação de colunas textuais com diferentes collations é que esse ocorre.

C – A substituição de LEFT OUTER JOIN por INNER JOIN pode alterar o sentido da consulta e também não tem qualquer impacto na ocorrência e nem na solução do problema.

D – Uma diferença de collation entre bases de dados pode provocar um erro de collation. Normalmente as colunas das tabelas herdam a collation da base de dados e se a collation das bases estiver diferente é possível que as colunas também tenham collations diferentes. Entretanto, é possível criar colunas com uma collation diferente da utilizada na base de dados e isso possibilitaria que bases com collations diferentes tenham colunas com collations iguais. Apena a diferença de collation entre bases não é garantia da ocorrência do erro.

Referências:
Como resolver problemas relacionados a conflitos de Collation
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!183.entry

Questão 019
Quais os dois comandos da lista abaixo são capazes de mostrar a collation de um banco de dados específico ?

A. SELECT SERVERPROPERTY(‘Collation’)
B. SELECT DATABASEPROPERTYEX(‘<Banco>’,‘Collation’ )
C. EXEC sp_helpdb ‘<Banco>’
D. SELECT Collation FROM sys.databases WHERE name = ‘<Banco>’
E. SELECT * FROM ::fn_helpcollations()
F. SELECT Collation FROM INFORMATION_SCHEMA.DATABASES WHERE name = ‘<Banco>’

Respostas Corretas: B e C

Explicação: A função DATABASEPROPERTYEX possibilita a consulta a várias propriedades de um banco de dados como status, recovery model, etc. Essa função pode ser utilizada para consultar a collation de um banco de dados. A stored procedure sp_helpdb retorna várias informações de um determinado banco de dados como os arquivos utilizados, a data de criação, o tamanho, etc. Entre essas informações está presente a collation utilizada.

Respostas Incorretas: A, D, E, F

A – A função SERVERPROPERY retorna a collation do servidor e não de um banco de dados específico. Normalmente um banco de dados irá utilizar a mesma collation que o servidor, mas não obrigatoriamente uma vez que é possível criar bancos  de dados com a collation diferente do servidor.

D – A view sys.databases não possui uma coluna chamada “Collation” e não há como saber a collation de um determinado banco de dados apenas consultando essa view.

E – A função ::fn_helpcollations retorna todas as collations possíveis de serem usadas, mas não retorna a collation utilizada por um banco de dados específico.

F – O objeto INFORMATION_SCHEMA.DATABASES não existe.

Questão 020
A relação abaixo lista alguns dos passos envolvidos na criação de uma tabela particionada.

1. Criação do esquema de particionamento
2. Criação da tabela
3. Criação dos arquivos adicionais de dados
4. Criação dos FILEGROUPs
5. Criação da função de particionamento

Qual das sequências a seguir pode ser utilizada para criar uma tabela particionada ?

A. 1, 5, 4, 3, 2
B. 4, 3, 5, 1, 2
C. 3, 4, 5, 1, 2
D. 3, 4, 1, 5, 2
E. 5, 4, 2, 1, 3

Resposta Correta: B

O primeiro passo para trabalhar com o particionamento de tabelas é a criação de uma função de particionamento (item 5). A função de particionamento determina a quantidade de partições e os ranges de valores para cada partição. O segundo passo é a criação de um esquema de particionamento (item 1). Esse esquema define onde fisicamente deverão ficar as partições. O esquema de particionamento referencia a função de particionamento para identificar quantas partições serão criadas e pode utilizar um ou mais FILEGROUPs para armazená-las. Normalmente a utilização de mais de um FILEGROUP para tabelas particionadas é uma boa prática em termos de desempenho. Se os arquivos de cada FILEGROUP residirem em discos separados é possível a leitura de dados de diferentes partições em paralelo. O passo seguinte é a criação da tabela (item 2) dentro do esquema de particionamento referenciando um das colunas da tabela para servir de critério de particionamento para que os dados sejam mapeados para as partições corretas.

O uso do particionamento não obriga a utilização de diferentes FILEGROUPs embora seja mais comum utilizá-lo dessa forma. Toda vez que um banco de dados é criado, o FILEGROUP PRIMARY fica disponível com um único arquivo de dados normalmente com a extensão MDF. Para a criação de FILEGROUPs adicionais é necessário sempre criar o FILEGROUP primeiro (item 4) para posteriormente adicionar arquivos a esse FILEGROUP (item 3). Não há ordem de precedência entre a criação de novos FILEGROUPs e a função de particionamento, mas é preciso que os FILEGROUPs estejam criados para que o esquema de particionamento possa utilizá-los. São corretas por tanto as sequências 4, 3, 5, 1, 2 e 5, 4, 3, 1, 2. Como apenas a primeira está presente, a resposta certa é B.

Respostas Incorretas: A, C, D, E

A – O esquema de particionamento não pode ser criado sem que exista uma função de particionamento para utilizá-lo.

C, D – Não é possível criar arquivos adicionais de dados sem que exista um FILEGROUP para associá-los. Os arquivos podem ser criados e adicionados ao FILEGROUP PRIMARY, mas não haveria como efetuar a troca de FILEGROUP posteriormente.

E – O esquema de particionamento deve ser informado antes da criação da tabela para que ela seja criada aproveitando-se o esquema e possa ser particionada.

Questão 021
Você é um implementador de banco de dados e está desenvolvendo um função de particionamento com o seguinte código:

CREATE PARTITION FUNCTION pf_Data (DATETIME2)
AS RANGE LEFT FOR VALUES (‘20080101’,‘20090101’,‘20100101’);

Os valores 01/01/2008 e 01/01/2009 00:30 ficarão respectivamente em quais partições ?

A. 1 e 2
B. 2 e 3
C. 1 e 3
D. Ambos ficarão na partição 2

Resposta Correta: C

Explicação: A função de particionamento utiliza valores para determinar os intervalos das partições. Quando o parâmetro LEFT é utilizado, significa que o valor será incluído na partição à esquerda da mesma forma que quando o parâmetro RIGHT é utilizada, significa que o valor será incluído na partição à direita. A tabela abaixo mostra como se comportam ambas implementações:

Partição LEFT RIGHT
1 <= 01/01/2008 < 01/01/2008
2 > 01/01/2008 e <= 01/01/2009 >= 01/01/2008 e < 01/01/2009
3 > 01/01/2009 e <= 01/01/2010 >= 01/01/2009 e < 01/01/2010
4 01/01/2010 01/01/2010

Na utilização do RANGEs com o uso do LEFT, o valor 01/01/2008 ficará na partição 1 e o valor 01/01/2009 00:30 ficará na partição 3. Como 01/01/2009 00:30 é um valor superior a 01/01/2009, ele não pode ficar na partição 2.

Respostas Incorretas: A, B, D

A – O uso da parâmetro LEFT incluirá o valor 01/01/2008 na partição 1 e colocará na partição 2 todos os valores maiores que 01/01/2008 e menores ou iguais a 01/01/2009. Como 01/01/2009 00:30 é superior a 01/01/2009, esse valor ficará na partição 3. Embora 01/01/2009 e 01/01/2009 00:30 sejam valores que representam o mesmo dia, o tipo de dados DATETIME2 fará diferenciação por conta das frações de segundo.

B – Analisando a tabela com as partições possíveis nas implementações LEFT e RIGHT, se fosse utilizado o parâmetro RIGHT, essa alternativa estaria correta, porém o parâmetro utilizado foi o LEFT.

D – Nenhuma das implementações possibilitará que esses valores fiquem na mesma partição.

[ ]s,

Gustavo

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

Boa Tarde Pessoal,

Seguindo a linha do meu último post, hoje postarei a primeira parte do simulado. Não tenho um número fechado de questões, mas postarei mais do que as 60 questões cobradas no exame. Essa primeira parte abordará 10 questões do primeiro tópico do exame "Implementing Tables and Views" responsável por 14% das questões da prova. Primeiro apresentarei as questões, depois as postarei novamente com as respostas e explicações.

Questão 001
Dentre as ferramentas abaixo, qual a mais adequada para a geração de scripts de estruturas de banco de dados (DDLs) em ambiente de desenvolvimento de forma a portá-los para outros ambientes ?

A. Generate SQL Server Scripts Wizard
B. Visual Source Safe
C. Visual Team Foundation
D. Database Scripting Wizard

Questão 002
O administrador de dados da empresa Produtos & Cia LTDA modelou uma tabela de pedidos com a seguinte estrutura:

A diferença entre a data do pedido e data da entrega é constantemente calculada pelas aplicações já que representa um indicador de eficiência da ABC Solutions. A idéia é que quanto menor for essa diferença, mas rápida uma entrega está sendo realizada. A fim de evitar que esse cálculo seja feito pelas aplicações e consultas SQL bem como fornecer melhor desempenho nas consultas qual das alternativas abaixo seria a melhor implementação ?

A. Criar uma coluna TempoEntrega e colocar uma CheckConstraint para validar o cálculo
B. Criar uma coluna TempoEntrega e colocar uma Trigger para fazer o cálculo e atualizar o registro
C. Criar uma coluna calculada (computed column) que faça o cálculo
D. Criar uma coluna calculada (computed column) que faça o cálculo e marcá-la como Persisted

Questão 003
Você é um desenvolvedor de uma fábrica de software da ZRW IT Solutions. Um dos analistas criou uma view com o seguinte código:

CREATE VIEW VW_TotalEmpregadosPorDepartamento
AS
SELECT
NomeDepto, COUNT(IDEmpregado) As Total
FROM RH.Departamentos As Depto
    INNER JOIN RH.Empregados As Emp ON Depto.DepartamentoID = Emp.DepartamentoID
GROUP BY NomeDepto

Eventualmente sua equipe faz algumas alterações nas estruturas das tabelas envolvidas nessa view. Qual seria a opção a ser adicionada nessa view para impedir que as tabelas Departamentos e Empregados sofram alterações no esquema que possam invalidar a view ?

A. SCHEMABINDING
B. CHECK OPTION
C. ENCRYPTION
D. PREVENT SOURCE SCHEMA CHANGES

Questão 004
A empresa ZOS Entregas Corporativas possui clientes em diversos lugares do Brasil. A grande concentração de clientes está no localizada no estado do Rio de Janeiro e as análises realizadas sobre essa amostra de clientes servem de base para os demais estudos. Você é um implementador de banco de dados e um dos desenvolvedores construiu uma view através do código abaixo:

CREATE VIEW CORP.VW_LojasRJ
AS
SELECT
IDLoja, Nome, Endereco, Cidade, UF, CEP, Telefone
FROM CORP.Lojas
WHERE UF = ‘RJ’

As seguintes instruções foram disparadas contra a view:

INSERT INTO CORP.VW_LojasRJ (IDLoja, Nome, Endereco, Cidade, UF, CEP, Telefone)
VALUES (1,‘Matriz RJ’, ‘R. Montevidéu, 1254 – Penha’, ‘Rio de Janeiro’, ‘RJ’, ‘22640102’,‘(21) 3804-8227’)

INSERT INTO CORP.VW_LojasRJ (IDLoja, Nome, Endereco, Cidade, UF, CEP, Telefone)
VALUES (2,‘Matriz SP’, ‘Rua Amauri,513 Bairro Paulista’, ‘São Paulo’, ‘SP’, ‘01014911’,‘(11) 3235-0321’)

Ambas as instruções foram bem sucedidas. A segunda instrução é do estado de São Paulo e embora a visão VW_LojasRJ filtre os registros do Rio de Janeiro, o registro de São Paulo foi inserido na tabela Lojas do esquema CORP. Qual opção deve ser colocada na view para que somente os registros do Rio de Janeiro possam ser incluídos a partir da view ?

A. ENCRYPTION
B. ENABLE FILTER
C. SCHEMABINDING
D. CHECK OPTION

Questão 005
A empresa Zion Tecnologia está revendo as políticas de segurança para as novas aplicações corporativas. Você como analista pleno deve avaliar a concessão de permissões obedecendo o princípio do menor privilégio. Uma view foi submetida para a análise em relação a segurança.

CREATE VIEW Vendas.VW_TotalPorUF
AS
SELECT
UF, SUM(TotalPedido) As TotalVendido FROM Vendas.Pedidos
GROUP BY UF

Considerando questões de segurança e administração, para que uma aplicação que se autentica com o usuário UsrApp possa acessar os dados através da view, quais linhas de código são necessárias ? (Marque todas que se aplicam)

A. GRANT SELECT ON Vendas.Pedidos TO UsrApp
B. GRANT SELECT ON Vendas.Pedidos (UF, TotalPedido) TO UsrApp
C. GRANT SELECT ON Vendas.VW_TotalPorUF TO UsrApp
D. DENY SELECT ON Vendas.Pedidos TO UsrApp
E. REVOKE SELECT ON Vendas.Pedidos TO UsrApp
F. DENY SELECT ON Vendas.Pedidos (UF, TotalPedido) TO UsrApp

Questão 006
Sobre a opção WITH ENCRYTION em conjunto com as views é correto afirmar:

A. As colunas das tabelas referenciadas pela view que estiverem criptografadas serão retornadas de forma criptografada, se não estiverem criptografadas serão retornadas normalmente
B. Essa opção não pode ser utilizada com views somente com stored procedures, functions e triggers
C. Os dados retornados em uma consulta contra a view serão criptografados
D. A instrução SELECT que define a view será criptografada

Questão 007
Qual das opções abaixo é desnecessária para criar uma view indexada ?

A. Utilizar a opção SCHEMABINDING na criação da View
B. Referenciar todos os objetos com o seu esquema
C. Substituir a função COUNT por COUNT_BIG
D. Utilizar a opção WITH ENCRYPTION
E. Não utilizar funções como MIN e MAX
F. Não utilizar subconsultas

Questão 008
O DBA está relatando que uma quantidade enorme de page splits está ocorrendo e recomendou que inicialmente que fosse ampliado o espaço vazio dentro das páginas de dados para 20%. Qual deve ser o valor do FILL FACTOR para atender essa solicitação ?

A. FILL FACTOR em 20%
B. FILL FACTOR em 80%
C. FILL FACTOR em 20% e PAD INDEX em 80%
D. FILL FACTOR em 80% e PAD INDEX em 20%

Questão 009
Qual dos recursos abaixos é uma das novas funcionalidades disponíveis a partir do SQL Server 2008 em relação à indexação ?

A. Included Columns em Índices Nonclustered
B. Bitmap Indexes
C. Filtered Indexes
D. Unique Indexes

Questão 010
Você está na equipe de otimização de código da Harm Corporate Solutions. Em um dos aplicativos que está apresentando lentidão identificou-se que uma determinada consulta está apresentando lentidão. O analista responsável verificou que o desempenho da seguinte instrução SELECT está demorando muito tempo.

SELECT NomeEmpregado, CPF, RG, Sexo
FROM Empregados
WHERE CPF = ‘70135714908’

Qual das opções abaixo seria o melhor índice para otimizar a consulta ?

A. NonClustered (CPF) – Include (NomeEmpregado, RG, Sexo)
B. NonClustered (CPF, NomeEmpregado, RG e Sexo)
C. NonClustered (CPF)
D. NonClustered (NomeEmpregado, RG, Sexo) – Include (CPF)
E. Clustered (NomeEmpregado, CPF, RG, Sexo)

Respostas

Questão 001
Dentre as ferramentas abaixo, qual a mais adequada para a geração de scripts de estruturas de banco de dados (DDLs) em ambiente de desenvolvimento de forma a portá-los para outros ambientes ?

A. Generate SQL Server Scripts Wizard
B. Visual Source Safe
C. Visual Team Foundation
D. Database Scripting Wizard

Resposta Correta: A

Explicação: O Wizard Generate SQL Server Scripts presente no SQL Server Management Studio é uma opção rápida e fácil de gerar scripts de estruturas de tabelas, views, stored procedures bem como permissões usuários e até o próprio banco de dados. Esse assistente já vem embutido no SQL Server Management Studio que possivelmente já estará instalado na máquina dos desenvolvedores.

Respostas Incorretas: B, C, D 

B – O Visual Source Safe é utilizado para versionamento de código e não possui a capacidade de gerar scripts.

C – Embora o Visual Team Foundation forneça muitos recursos interessantes para o desenvolvedor de banco de dados tais como geração de massa de dados, scripts de comparação e conciliação de estruturas e dados, elaboração de testes, etc, a instalação representaria um overhead desnecessário para apenas gerar scripts de estrutura além de um custo de licenciamento adicional.

D – O Database Scripting Wizard é uma ferramenta gratuita capaz de gerar os scripts de estruturas de banco de dados bem como as instruções de INSERT com os próprios dados. Embora seja capaz de gerar os scripts de estrutura é necessário uma instalação adicional e a presença do SMO do SQL Server 2005.

Questão 002
O administrador de dados da empresa Produtos & Cia LTDA modelou uma tabela de pedidos com a seguinte estrutura:

A diferença entre a data do pedido e data da entrega é constantemente calculada pelas aplicações já que representa um indicador de eficiência da ABC Solutions. A idéia é que quanto menor for essa diferença, mas rápida uma entrega está sendo realizada. A fim de evitar que esse cálculo seja feito pelas aplicações e consultas SQL bem como fornecer melhor desempenho nas consultas qual das alternativas abaixo seria a melhor implementação ?

A. Criar uma coluna TempoEntrega e colocar uma CheckConstraint para validar o cálculo
B. Criar uma coluna TempoEntrega e colocar uma Trigger para fazer o cálculo e atualizar o registro
C. Criar uma coluna calculada (computed column) que faça o cálculo
D. Criar uma coluna calculada (computed column) que faça o cálculo e marcá-la como Persisted

Resposta Correta: D

Explicação: A criação de uma coluna calculada evitará a necessidade de se explicitar o cálculo do tempo de entrega nas aplicações e nas consultas SQL. Se ela for marcada como Persisted ele será armazenada juntamente com as demais colunas. Nessa implementação, o SQL Server apenas fará a recuperação sem efetuar o cálculo já que esse foi feito previamente e armazenado.

Respostas Incorretas: A, B, C

A – O uso de uma CHECK Constraint pode ser usado para validar o cálculo, mas não o fará automaticamente.

B – O uso de uma trigger para fazer o cálculo e armazená-lo em uma coluna a parte proporcionará uma desempenho semelhante ao uso da coluna calculada e armazenada (persisted). Entretanto, o uso da coluna calculada representa um overhead inferior ao da trigger além de representar menos código e mais consistência. Uma coluna calculada jamais poderá ter seu valor alterado manualmente enquanto que um campo populado por uma trigger pode ser alterado caso a trigger seja desabilitada.

C – O uso da coluna calculada sem a persistência irá simplificar o cálculo por parte das aplicações e consultas SQL, mas irá exigir que o SQL Server efetue o cálculo toda vez que a consulta for feita. Se a coluna for marcada como Persisted haverá um consumo adicional de espaço, mas não será necessário fazer o cálculo a cada consulta.

Questão 003
Você é um desenvolvedor de uma fábrica de software da ZRW IT Solutions. Um dos analistas criou uma view com o seguinte código:

CREATE VIEW VW_TotalEmpregadosPorDepartamento
AS
SELECT
NomeDepto, COUNT(IDEmpregado) As Total
FROM RH.Departamentos As Depto
    INNER JOIN RH.Empregados As Emp ON Depto.DepartamentoID = Emp.DepartamentoID
GROUP BY NomeDepto

Eventualmente sua equipe faz algumas alterações nas estruturas das tabelas envolvidas nessa view. Qual seria a opção a ser adicionada nessa view para impedir que as tabelas Departamentos e Empregados sofram alterações no esquema que possam invalidar a view ?

A. SCHEMABINDING
B. CHECK OPTION
C. ENCRYPTION
D. PREVENT SOURCE SCHEMA CHANGES

Resposta Correta: A

Explicação: A opção SCHEMABINDING faz um vínculo de esquema impedindo que os objetos participantes na view sofram alterações que invalidem a view como exclusão de colunas referenciadas, alteração do tipo de dados dessas colunas e exclusão de objetos utilizados na view.

Respostas Incorretas: B, C, D

B – A opção CHECK OPTION impede que registros que não seriam recuperados pela view possam ser inseridos na mesma. Se a view utilizar uma cláusula WHERE (Ex: WHERE Estado = ‘RJ’) por padrão será possível inserir registros que não satisfaçam essa condição (Ex: Registros cujo estado não seja RJ). O uso da opção CHECK OPTION impede essa inserção. Essa opção não é capaz de impedir alterações nas tabelas Departamentos e Empregados.

C – A opção WITH ENCRYPTION apenas criptografa o código da view não impedindo que alterações possam ser realizadas contra as tabelas de Departamentos e Empregados.

D – A opção PREVENT SOURCE SCHEMA CHANGES não existe no SQL Server.

Questão 004
A empresa ZOS Entregas Corporativas possui clientes em diversos lugares do Brasil. A grande concentração de clientes está no localizada no estado do Rio de Janeiro e as análises realizadas sobre essa amostra de clientes servem de base para os demais estudos. Você é um implementador de banco de dados e um dos desenvolvedores construiu uma view através do código abaixo:

CREATE VIEW CORP.VW_LojasRJ
AS
SELECT
IDLoja, Nome, Endereco, Cidade, UF, CEP, Telefone
FROM CORP.Lojas
WHERE UF = ‘RJ’

As seguintes instruções foram disparadas contra a view:

INSERT INTO CORP.VW_LojasRJ (IDLoja, Nome, Endereco, Cidade, UF, CEP, Telefone)
VALUES (1,‘Matriz RJ’, ‘R. Montevidéu, 1254 – Penha’, ‘Rio de Janeiro’, ‘RJ’, ‘22640102’,‘(21) 3804-8227’)

INSERT INTO CORP.VW_LojasRJ (IDLoja, Nome, Endereco, Cidade, UF, CEP, Telefone)
VALUES (2,‘Matriz SP’, ‘Rua Amauri,513 Bairro Paulista’, ‘São Paulo’, ‘SP’, ‘01014911’,‘(11) 3235-0321’)

Ambas as instruções foram bem sucedidas. A segunda instrução é do estado de São Paulo e embora a visão VW_LojasRJ filtre os registros do Rio de Janeiro, o registro de São Paulo foi inserido na tabela Lojas do esquema CORP. Qual opção deve ser colocada na view para que somente os registros do Rio de Janeiro possam ser incluídos a partir da view ?

A. ENCRYPTION
B. ENABLE FILTER
C. SCHEMABINDING
D. CHECK OPTION

Resposta Correta: D

Explicação: A opção CHECK OPTION verifica a cláusula WHERE utilizada na view e impede que registros sejam inseridos caso não obedecam ao critério na cláusula WHERE. Como esse critério estipula que todos os registros devam ser do estado do Rio de Janeiro (WHERE Estado = ‘RJ’), qualquer registro que desobedeça esse critério não poderá ser inserido na view. Os registros que forem inseridos serão redirecionados para a tabela CORP.Lojas.

Respostas Incorretas: A, B, C 

A – A opção ENCRYPTION é capaz de criptografar o código da view, mas se a view já permitia a inserção do registro de São Paulo, criptografar o código da view não irá impedir a inserção desse registro.

B – A opção ENABLE FILTER não existe no SQL Server.

C – A opção SCHEMABINDING é responsável por impedir que alterações que invalidariam a view sejam feitas nos objetos participantes, mas não impedirá que a inserção seja realizada.

Questão 005
A empresa Zion Tecnologia está revendo as políticas de segurança para as novas aplicações corporativas. Você como analista pleno deve avaliar a concessão de permissões obedecendo o princípio do menor privilégio. Uma view foi submetida para a análise em relação a segurança.

CREATE VIEW Vendas.VW_TotalPorUF
AS
SELECT
UF, SUM(TotalPedido) As TotalVendido FROM Vendas.Pedidos
GROUP BY UF

Considerando questões de segurança e administração, para que uma aplicação que se autentica com o usuário UsrApp possa acessar os dados através da view, quais linhas de código são necessárias ? (Marque todas que se aplicam)

A. GRANT SELECT ON Vendas.Pedidos TO UsrApp
B. GRANT SELECT ON Vendas.Pedidos (UF, TotalPedido) TO UsrApp
C. GRANT SELECT ON Vendas.VW_TotalPorUF TO UsrApp
D. DENY SELECT ON Vendas.Pedidos TO UsrApp
E. REVOKE SELECT ON Vendas.Pedidos TO UsrApp
F. DENY SELECT ON Vendas.Pedidos (UF, TotalPedido) TO UsrApp

Resposta Correta: C

Explicação: A concessão de permissão de SELECT concedida via GRANT ao usuário UsrApp é necessária para que o usuário possa ler dados a partir da view.

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

A, B – Uma vez que a view e a tabela pertencem ao mesmo esquema não é necessário conceder qualquer permissão na tabela Pedidos para que a view VW_TotalPorUF possa ser utilizada.

D, F – Não há necessidade de negar explicitamente o acesso à tabela Pedidos ou às colunas da mesma. Se o usuário UsrApp tiver permissão somente na view ele não conseguirá acessar a tabela. Se o usuário tiver acesso à view, a negativa na tabela não irá impedir o acesso. Essa medida não provê segurança adicional e aumenta o overhead administrativo.

E – O uso do REVOKE retirará qualquer permissão explícita (GRANT) ou negativa explícita (DENY) e não irá conceder acesso ao usuário UsrApp para acessar os dados através da view.

Questão 006
Sobre a opção WITH ENCRYTION em conjunto com as views é correto afirmar:

A. As colunas das tabelas referenciadas pela view que estiverem criptografadas serão retornadas de forma criptografada, se não estiverem criptografadas serão retornadas normalmente
B. Essa opção não pode ser utilizada com views somente com stored procedures, functions e triggers
C. Os dados retornados em uma consulta contra a view serão criptografados
D. A instrução SELECT que define a view será criptografada

Resposta Correta: D

Explicação: O uso da opção ENCRYPTION serve para criptografar o código TSQL que define o objeto e aplica-se à views, stored procedures, functions e triggers. Uma vez que o código esteja criptografado, a função OBJECT_DEFINITION e a stored procedures sp_helptext não serão capazes de retornar o código TSQL. Essa função impede apenas que o código da view seja lido. É possível alterá-lo através do comando ALTER VIEW ou ainda excluir e criar novamente a view.

Respostas Incorretas: A, B, C

A, C – Se houver colunas criptografadas na tabelas que sejam referenciadas pela view, elas serão recuperadas de forma criptografada. O uso da opção ENCRYPTION criptografa apenas o código encapsulado pela view e não os dados retornados por ela.

B – O uso da opção ENCRYPTION pode ser utilizado em views da mesma forma que é utilizado em stored procedures, functions e triggers.

Questão 007
Qual das opções abaixo é desnecessária para criar uma view indexada ?

A. Utilizar a opção SCHEMABINDING na criação da View
B. Referenciar todos os objetos com o seu esquema
C. Substituir a função COUNT por COUNT_BIG
D. Utilizar a opção WITH ENCRYPTION
E. Não utilizar funções como MIN e MAX
F. Não utilizar subconsultas

Resposta Correta: D

Explicação: A opção ENCRYPTION serve apenas para criptografar o código TSQL que define a view. O uso dessa opção não é imprescindível para que a view seja indexada. A lista completa de pré-requisitos pode ser encontrada no Book Online (Indexed Views)

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

A, B, C, E, F – As condições citadas são algumas das necessárias para que uma determinada view possa ser indexada.

Questão 008
O DBA está relatando que uma quantidade enorme de page splits está ocorrendo e recomendou que inicialmente que fosse ampliado o espaço vazio dentro das páginas de dados para 20%. Qual deve ser o valor do FILL FACTOR para atender essa solicitação ?

A. FILL FACTOR em 20%
B. FILL FACTOR em 80%
C. FILL FACTOR em 20% e PAD INDEX em 80%
D. FILL FACTOR em 80% e PAD INDEX em 20%

Resposta Correta: B

Explicação:  A tradução de Fill Factor é fator de preenchimento. Ele aplica-se somente ao nível de folha (Leaf Level). Sabendo-se que as páginas de dados sempre estão no nível folha e considerando 100% a capacidade de ocupação da página, para que haja 20% de espaço livre é necessário configurar o fator de preenchimento para 80%.

Respostas Incorretas: A, C, D

A – Configurar o Fill Factor para 20% deixará as páginas com 20% de ocupação e não com 20% de espaço livre.

C, D – A opção PAD INDEX é o conceito de Fill Factor aplicado às páginas que não estão no nível folha (Non Leaf Level Page). Até o SQL Server 2000 era possível especificar valores de PAD INDEX diferentes do Fill Factor. No SQL Server 2008 não há como fazer essa diferenciação e portanto as alternativas C e D não são implementáveis.

Questão 009
Qual dos recursos abaixos é uma das novas funcionalidades disponíveis a partir do SQL Server 2008 em relação à indexação ?

A. Included Columns em Índices Nonclustered
B. Bitmap Indexes
C. Filtered Indexes
D. Unique Indexes

Resposta Correta: C

Explicação: O SQL Server 2008 implementou o uso de cláusulas WHERE no índice fazendo com que apenas os registros qualificados pela cláusula WHERE sejam considerados para indexação. Isso possibilita a escolha de valores mais seletivos e bons candidatos ao uso do índice em oposição aos valores menos seletivos que não são bons candidatos ao uso do índice.

Respostas Incorretas: A, B, D

A – O uso de Included Columns está disponível desde o SQL Server 2005

B – O SQL Server não possui estruturas de indexação do tipo Bitmap

D – O uso de Unique Indexes está disponível no SQL Server desde suas primeiras versões

Questão 010
Você está na equipe de otimização de código da Harm Corporate Solutions. Em um dos aplicativos que está apresentando lentidão identificou-se que uma determinada consulta está apresentando lentidão. O analista responsável verificou que o desempenho da seguinte instrução SELECT está demorando muito tempo.

SELECT NomeEmpregado, CPF, RG, Sexo
FROM Empregados
WHERE CPF = ‘70135714908’

Qual das opções abaixo seria o melhor índice para otimizar a consulta ?

A. NonClustered (CPF) – Include (NomeEmpregado, RG, Sexo)
B. NonClustered (CPF, NomeEmpregado, RG e Sexo)
C. NonClustered (CPF)
D. NonClustered (NomeEmpregado, RG, Sexo) – Include (CPF)
E. Clustered (NomeEmpregado, CPF, RG, Sexo)

Resposta Correta: A

Explicação: A consulta utiliza um filtro na coluna CPF e recupera as colunas NomeEmpregado, CPF, RG e Sexo. Utilizar a coluna CPF como chave do índice NonClustered auxilia a pesquisa dos registros e incluir no índice as colunas NomeEmpregado, RG e Sexo faz com que apenas à consulta ao índice recupere os dados desejados sem a necessidade de acesso direto à tabela.

Respostas Incorretas: B, C, D, E

B – Um índice NonClustered com o CPF como primeira coluna e as demais colunas da cláusula SELECT poderia ser utilizado já que o CPF serve para filtrar os registros e as demais colunas permitem a recuperação dos dados sem acesso direto à tabela. Entretanto, como as demais colunas estão presentes na chave do índice, o espaço necessário e o overhead para mantê-lo serão consideráveis.

C – Um índice NonClustered tendo apenas o CPF pode auxiliar a pesquisa, mas como o índice possui apenas o CPF e os ponteiros, será necessário acessar o índice e posteriormente a tabela. É uma boa implementação, mas o uso do Include é mais performático para a recuperação de dados.

D – Esse índice não possui o CPF como chave do índice e não terá a capacidade de pesquisar os registros com base no CPF. Por contemplar todas as colunas necessárias para atender a consulta ele pode ser utilizado, mas o espaço e o overhead de manutenção por conta da chave do índice desmotivam essa implementação. Adicionalmente, o fato do CPF não ser a primeira coluna da chave provocará uma varredura completa do índice para atender a consulta.

E – O uso de um índice clustered influenciará a ordenação dos dados com base nas colunas do índice. A consulta não se beneficiará de um índice cuja ordenação seja inicialmente pela coluna NomeEmpregado.

[ ]s,

Gustavo

Considerações para a prova 70-433 – MCTS: Microsoft SQL Server 2008 – Database Development

Boa Tarde Pessoal,

Ultimamente anda muito difícil conciliar todos os afazeres familiares, pessoais e profissionais com as comunidades de SQL Server. Profissionalmente apareceram alguns desafios que tem tomado muito o meu tempo além de vários cursos para exercitar minha credencial de MCT. Fico feliz, pois, estão sendo experiências muito interessantes, mas por outro lado minha participação tem diminuído significativamente (nunca estive tão ausente dos fóruns da Microsoft e das comunidades do Orkut). De fato há épocas do ano em que preciso me aperfeiçoar, estudar, certificar e adquirir novos conhecimentos e experiências para que possa posteriormente repassá-los na forma de artigos no blog, post de ajuda, webcasts ou publicações em revistas técnicas. Creio que irei passar por um período desses por algum tempo.

Todavia ajudar às comunidades é algo que sempre me dá certo prazer e satisfação pessoal. Mais que isso, é uma forma de me ambientar, pois, nada mais interessante que conhecer outras realidades, dúvidas e experiências diferentes das que eu passo no meu cotidiano. Tempo é um recurso fundamental para ajudá-las, mas a falta de tempo não significa que não possa fazer as devidas contribuições, basta um pouco de criatividade para aliar alguns objetivos com os interesses da comunidade.

No final do ano passado, estipulei um planejamento relacionado a SQL Server para realizar durante esse ano no que chamei de Objetivos e Metas para 2010. Um das meus objetivos é escrever um livro sobre SQL Server. Essa talvez seja um dos objetivos mais difíceis de cumprir, mas espero cumprí-lo. Há muito temas que possuo afinidade e um desses me motivou a produzir um livro. Tenho visto muitas pessoas procurando materiais sobre as provas 70-432 e 70-433 e até bem pouco tempo atrás não havia nada em português sobre esse assunto. Com o lançamento do Traning Kit para a 70-432 em português, a grande quantidade de braindumps na Internet e vários sites de simulados eu acredito que comercializar um livro sobre esse tema não seja algo tão interessante quanto eu achava.

Minha idéia não era produzir um livro completo incluindo a matéria e os exercícios, mas simplesmente uma lista de várias questões preparatórias para a prova (no caso a 70-433). Elaborei várias questões contemplando o assunto da prova e como não irei mais comercializá-las resolvi postá-las no blog na forma de simulado. Ao final de todas as postagens montarei um PDF para distribuição que seria algo muito próximo do livro que eu escreveria. Claro que a idéia de escrever um livro sobre outro assunto está de pé e farei isso posteriormente. Por hora, gostaria de compartilhar essas questões preparatórias para a prova 70-433 necessária para obter a credencial Microsoft Certified Technology Specialist (MCTS): SQL Server 2008, Database Development.

A prova 70-433

As informações sobre a prova 70-433 estão no site da Microsoft através do link http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-433 (visitado 02/05/2010). Essa é uma prova mais voltada para profissionais de desenvolvimento que trabalhem com o SQL Server. Aqueles que gostam de escrever stored procedures, códigos em TSQL ou se sintam muito à vontade com tarefas de modelagem de dados ou que gostem de funcionalidades como XML, CLR, Service Broker, etc representam um perfil típico de quem faz essa prova. Já profissionais voltados apenas à administração de banco de dados exclusivamente talvez tenham um certo mal estar com essa prova, pois, aqueles conhecimentos de redes, clustering, backups, etc de nada vão valer nessa prova. Ela me lembra muito a antiga 70-229 do SQL Server 2000 que era um verdadeiro pesadelo para o System Engineers que queriam tirar o MCDBA. Era realmente penoso para um profissional de infraestrutura se debater com os cursores, queries, stored procedures, etc.

A aprovação nessa prova concederá o título de MCTS em SQL Server 2008 Database Development que nada mais é que uma certificação que atesta os conhecimentos míninos nas atividades de desenvolvimento que envolvam o SQL Server. É um certificação muito interessante para o time de desenvolvimento que trabalha com o SQL Server, pois, mostra um certo diferencial.

Como é a prova ?

O conteúdo oficial da prova também está disponível no site da Microsoft no mesmo link passado anteriormente. Ele possui algo entre 60 e 70 questões apenas de marcação (isso mesmo não é nada dissertativo). Não existem também estudos de caso os quais você lê textos enormes para responder cada meia dúzia de questões como a 70-441 e 70-443 do MCITP para o SQL Server 2005. Alguns já me perguntaram se há questões práticas como as de simulação da 70-431. Com todas as pessoas que conversei nenhuma disse ter visto esse tipo de questão na prova (acredito que não exista). A aprovação ocorre se você tirar 700 pontos o que equivale a 70% da pontuação máxima (cerca de 46 questões se prova possuir 65 questões). A duração é de aproximadamente duas horas podendo ser ampliada caso o idioma seja diferente do idioma nativo do candidato (típico do exame em inglês para profissionais do Brasil).

Como posso lhe ajudar com essa prova ?

Não vou repetir os detalhes da prova, pois, eles estão documentados no site da Microsoft. Também não postarei questões da prova, pois, isso viola o NDA que concordei no momento de realizar exames da Microsoft. Minha proposta é apresentar um simulado com várias questões no estilo da prova. Eu elevei o nível de dificuldade para um nível superior ao da prova. Acredito que os que forem bem no meu simulado, conseguirão fazer a prova com muita facilidade. Aqueles que não forem bem não precisam desanimar. Se esse for o caso, minha sugestão é anotar os tópicos de maior dificuldade e dar uma revisada antes de tentar a prova.

Bem, é isso. Vamos agora a um post com algumas questões preparatórias para esse exame.

[ ]s,

Gustavo