Você está na página 1de 7

iMasters - Por uma Internet mais criativa e dinâmica Página 1 de 7

Mauro Pichiliani Segunda-feira, 28 de julho de 2003

25 principais dúvidas
Acompanharemos nesta matéria uma série das 25 principais dúvidas dos leitores da coluna SQL Server
iMasters que são enviadas diariamente por e-mail.

Pergunta 01. Existe algum assistente para conversão de banco de dados Access para o SQL Server?

Resposta: Sim, existe. A Microsoft fez um Upsizing Wizard para quem trabalha com o Access. Esta ferramenta
é free e pode ser baixada aqui.

_________________________________________

Pergunta 02. Onde posso encontrar HOWTO’s para o SQL Server?

Resposta: Quando se instala qualquer versão do SQL Server (até a versão MSDE) uma arquivo chamado
howtosql.chm é instalado junto. Este arquivo fica no diretório C:Program FilesMicrosoft SQL
Server80ToolsBooks (isso pode mudar de acordo com o local de instalação) e é um arquivo .chm, o novo
formato para ajuda do Windows, que substitue o .hlp. A Microsoft também coloca vários HOWTO no seu site
de suporte, o http://support.microsoft.com

_________________________________________

Pergunta 03. Apliquei um service pack e quero desinstalá-lo. Existe como?

Resposta: Infelizmente não. A própria Microsoft recomenda o seguinte para se desinstalar um service pack:

a) Faça um backup full de todos os seus bancos de dados , inclusive os de sistema (MASTER , MODEL,
MSDB e DISTRUBITION).

b) Desinstale a instância do SQL Server.

c) Instale o SQL Server e aplique até qual service pack se deseja.

_________________________________________

Pergunta 04. Não consigo mais ver o banco de dados Master, Model e TempDB no Enterprise Manager.
O que aconteceu?

Resposta: No Enterprise Manager existe uma opção que esconde (mas não apaga) os bancos de dados e as
tabelas de sistema. Para habilitar/desabilitar esta opção faça o seguinte:

a) No Enterprise Manager, clique com o botão direito do mouse sobre o servidor e escolha Edit SQL Server
Registration Properties…

b) Marque ou desmarque o check box Show system databases and system objects

http://imasters.uol.com.br/artigo/1235/sql_server/25_principais_duvidas/imprimir/ 29/03/2008
iMasters - Por uma Internet mais criativa e dinâmica Página 2 de 7

_________________________________________

Pergunta 05. Criei uma tabela com três campos e fiz uma view para esta tabela utilizando o ‘select *
from tabela’. Porém futuramente precisei incluir um novo campo na tabela mas não alterei a view. Se a
view foi criada com ‘select * ‘, por quê o novo campo não aparece quando tento executar a view?

Resposta: Quando criamos uma view, mesmo que na definição da view coloquemos select *, todos os nomes
das colunas da(s) tabela(s) base são armazenadas junto com a definição da view em uma tabela de sistema
chamada syscolumns. Fica mais fácil ver quais colunas a view se refere através da system stored procedure
sp_depends, passando como parâmetro o nome da view.

De qualquer forma, quando mexemos na estrutura da(s) tabela(s) base devemos alterar a view para que a nova
coluna seja levada em consideração quando fazemos um SELECT na view.

_________________________________________

Pergunta 06. Existe alguma maneira do SQL Server saber que inseriu ou apagou um registro em uma
tabela? O Transaction Log serve para isso?

Resposta: Infelizmente o SQL Server não faz este tipo de auditoria automaticamente. O Transaction Log é um
arquivo que contém as transações efetuadas em um banco de dados e não tem como função trabalhar com
auditoria.

Agora uma idéia para se implementar esta funcionalidade poderia ser através de triggers: para cada tabela
defina um trigger para o INSERT, UPDADE e DELETE. Dentro deste trigger você pode fazer um INSERT em
uma tabela de auditoria armazenando qualquer informação que se desejar como qual o usuário que fez qual
comando, a data/hora, o nome do aplicativo, o registro anterior e no novo, etc.

_________________________________________

Pergunta 07. Enquanto estou fazendo um backup no meu banco de dados os usuários podem continuar a
utilizá-lo? E o Restore?

Resposta: Enquanto um backup está sendo executado o banco de dados pode continuar a ser executado
normalmente. Somente algumas instrução Transact-SQL não devem ser feitas durante o processo de backup
como criação, alteração ou deleção de bancos de dados.

O processo de Restore requer que o banco de dados esteja em um modo especial, chamado de single user e
ninguém pode estar conectado ao banco de dados que está sendo restaurado. Por padrão o próprio comando
RESTORE DATABASE já tenta colocar o banco de dados de destino neste modo, emitindo um erro caso não
consiga.

_________________________________________

Pergunta 08. Existe algum construtor de consulta no SQL Server como no Access?

Resposta: Sim, existe um construtor de consultas muito parecido com o do Access no SQL Server. Para acessá-
lo , expanda o seu servidor no Enterprise Manager, expanda o seu banco de dados, clique no ícone view com o
botão direito do mouse e escolha New View. O construtor é muito parecido com o do Access mas faltam coisas,
como por exemplo a caixa de diálogo que permite a construção de expressões.

_________________________________________

Pergunta 09. Como faço para obter somente a data ou somente a hora de um campo

http://imasters.uol.com.br/artigo/1235/sql_server/25_principais_duvidas/imprimir/ 29/03/2008
iMasters - Por uma Internet mais criativa e dinâmica Página 3 de 7

datetime/smalldatetime?

Resposta: Tanto para o tipo de dados datetime como para o smalldatetime o SQL Server armazena tanto a data
como a hora. Porém há como fazer o SQL Server retornar somente a hora de um campo datetime ou
smalldatetime com a função CONVERT(). Por exemplo:

create table teste_hora


(
dt datetime
)
GO
Insert teste_hora values(getdate())
Select convert(char(10),dt,108)
From teste_hora

Para mais informações sobre CONVERT() consulte o Books OnLine.

_________________________________________

Pergunta 10. Perdi a senha do usuário administrador sa do SQL Server. O que posso fazer?

Resposta: Por padrão , logo após o SQL Server ser instalado todos os usuários que fazem parte do grupo
Administrators (Administradores) já são mapeados para o SQL Server e fazem parte do fixed server role
sysadmin.

Basta então se logar na máquina como um Administrador, conectar-se no SQL Server com Windows
Authentication e trocar a senha do usuário sa através do Enterprise Manager ou através da system Stored
Procedure sp_password.

_________________________________________

Pergunta 11. Quando o SQL Server faz um backup ele já comprime os dados?

Resposta: Apesar de fazer backup somente dos dados e do transaction log o SQL Server não comprime o
arquivo final de backup independente de qual tipo de backup seja feito (FULL, DIFFERENTIAL ou
TRANSACTION LOG).

Fiz um pequeno teste com um programa tipo Winzip e consegui uma boa taxa de compactação. Só devemos ter
o cuidado de descompactar o arquivo de dispositivo que contém o backup antes de fazer o restore.

_________________________________________

Pergunta 12. Onde consigo informações sobre o que mudou de uma versão do SQL Server para outra? E
quanto aos service pack?

Resposta: Sempre que a Microsoft lança uma nova versão do SQL Server o Books OnLine (documentação
eletrônica oficial do produto) contém muita informação sobre que o mudou de uma versão para outra.

Quanto aos service packs, na página disponibilizada para download do mesmo (que varia de acordo com a
versão do service pack) sempre é colocar um fix list que mostra tudo que foi modificado no respectivo service
pack.

De qualquer maneira no site oficial do SQL Server sempre há informações sobre isso:
http://www.microsoft.com/sql/

http://imasters.uol.com.br/artigo/1235/sql_server/25_principais_duvidas/imprimir/ 29/03/2008
iMasters - Por uma Internet mais criativa e dinâmica Página 4 de 7

_________________________________________

Pergunta 13. Como faço a função IIF() que eu uso em outras linguagens no SQL Server?

Resposta: Não existe a função IIF() no SQL Server para fazer uma decisão dinâmica em tempo de execução.
Porém ela pode ser facilmente simulada utilizando a estrutura CASE do SQL Server. Por exemplo: quanto o
campo T_01 da tabela TESTE possuir um valor maior que 10 será mostrado ‘muito’ caso contrário será
mostrado ‘pouco’:

SELECT T_00 , CASE T_01 WHEN T_01 > 10 THEN ‘muito’


ELSE ‘pouco’ END
FROM TESTE

O case pode ser utilizado também na cláusula WHERE. Por exemplo: quando o valor do campo
VAL_DEPOSITO for menor que zero a comparação vai ser feita baseada no campo SALDO_POUPANÇA ,
quando for maior ou igual a zero a comparação é feita no campo SALDO e quando o saldo for maior que 10000
a comparação é feita no campo SALDO_APP:

SELECT NOME , SALDO , SALDO_POUPANÇA , SALDO_APP , VAL_DEPOSITO


FROM CONTA_CORRENTE
WHERE ( CASE SALDO WHEN SALDO < 0 THEN SALDO_POUPANÇA
WHEN SALDO >= 0 THEN SALDO
WHEN SALDO > 10000 THEN SALDO_APP ) > VAL_DEPOSITO

_________________________________________

Pergunta 14. Existe uma maneira de eu limitar o tempo de execução de uma query, para evitar que ela
consuma todos os recursos do sistema operacional?

Resposta: Sim, o SQL Server possui uma opção chamada de Query Governor que seta um limite máximo de
tempo que uma query pode ficar executando. Por padrão (valor 0) toda query pode rodar independente de
quanto tempo ela demora. Configurando um valor com a opção SET QUERY_GOVERNOR_COST_LIMIT
você irá forçar que , durante a sua conexão, qualquer query que demorar mais de segundos para executar não
será permitida.

_________________________________________

Pergunta 15. Tem como fazer o SQL Server retornar algumas linhas aleatórias de uma tabela
automaticamente?

Resposta: Existem várias maneiras de se fazer isto porém a mais simples é utilizar a função não determinística
NEWID() na cláusula ORDER BY. Limite a quantidade de registros aleatórios utilizando a cláusula TOP:

SELECT TOP 5 *
FROM TABELA
ORDER BY NEWID()

_________________________________________

Pergunta 16. Quando crio um operador no Enterprise Manager por quê as opções de horário na qual
este operador está trabalhando não estão habilitadas?

Resposta: As opções de horário para o operador são habilitadas somente quando se cadastra um endereço de e-
mail no campo Pager email name. A funcionalidade de pager no SQL Server é a seguinte: você cadastra um

http://imasters.uol.com.br/artigo/1235/sql_server/25_principais_duvidas/imprimir/ 29/03/2008
iMasters - Por uma Internet mais criativa e dinâmica Página 5 de 7

endereço de e-mail e o SQL Server envia a mensagem para este endereço.

Antigamente, quando os pagers eram mais populares, havia como enviar uma mensagem para um pager
somente enviando a mensagem para um endereço específico. Hoje em dia o celular quase que aboliu a
utilização do pager mais a funcionalidade ainda existe no SQL Server que, a propósito, não envia mensagens
SMS.

_________________________________________

Pergunta 17. Como posso mudar o proprietário de um objeto no SQL Sever?

Resposta: Você pode mudar o proprietário de um objeto através da system stored procedure
sp_changeobjectowner. Por exemplo:

A usuária de banco de dados maria criou uma tabela chamada TAB01 no banco Pubs. Portanto o nome do
objeto é:

Pubs.maria.TAB01

O administrador do sistema quis trocar o proprietário da tabela TAB01 de modo que o novo dono da tabela será
o usuário de banco de dados carlos. O administrador fez o seguinte comando:

EXEC sp_changeobjectowner 'TAB01', 'carlos'

Portanto o nome do objeto agora é:

Pubs.carlos.TAB01

_________________________________________

Pergunta 18. Em quais linguagens o SQL Server trabalha?

Resposta: O SQL Server trabalha diretamente com a sua própria versão do SQL, que respeita o padrão SQL
ANSI 92 chamada Transact-SQL que possui funcionalidades exclusivas.

Porém virtualmente qualquer linguagem de programação pode acessar o SQL Server, desde que haja como se
conectar ao servidor. Os métodos de conexão mais comuns são aqueles onde a linguagem de programação
possui uma API que chama ou um provider OLE DB ou um DSN do ODBC. Há também a biblioteca JDBC
para permitir a conectividade com a linguagem JAVA.

_________________________________________

Pergunta 19. Por que o Query Analyser somente mostra os primeiros 256 caracteres de um campo
caracter?

Resposta: Esta é a configuração padrão do Query Analyser, mostrar somente os 256 carateres de uma coluna.
Para aumentar este valor vá no menu Tools e escolha Options.

Clique na aba Results e digite a quantidade máxima de caracteres que deverá ser exibida por coluna. O maior
valor é 5000.

_________________________________________

http://imasters.uol.com.br/artigo/1235/sql_server/25_principais_duvidas/imprimir/ 29/03/2008
iMasters - Por uma Internet mais criativa e dinâmica Página 6 de 7

Pergunta 20. Existe um Resource Kit para o SQL Server 2000?

Resposta: Sim, existe um Resource Kit para SQL Server 2000 que contém muitas informações bem úteis sobre
o produto. O Resource Kit pode ser visto OnLine no site TechNet da Microsoft neste endereço.

_________________________________________

Pergunta 21. Como forço a utilização de um índice em um SELECT?

Resposta: A utilização de um índice pode ser forçada através de um table hint para cada tabela em uma query.
Por exemplo, para forçar a utilização do índice IX_02 que foi criado na tabela Pedidos faça o seguinte comando
SELECT:

SELECT COD_PEDIDO , DATA_PEDIDO , CLI_PEDIDO


FROM PEDIDOS WITH(INDEX = IX_02 )
WHERE COD_PEDIDO BETWEEN 10 AND 4000

Porém é extremamente não recomendado forçar a utilização de um índice em uma query por vários motivos. O
mais aconselhável é deixar o SQL Server fazer a análise necessário e utilizar ( ou não ) o melhor índice que ele
achar melhor.

_________________________________________

Pergunta 22. Qual é a diferença entre um trigger normal e um trigger INSTEAD OF?

Resposta: Um trigger normal na verdade é um trigger AFTER. Este tipo de trigger acontece junto com a
transação que disparou o trigger seja ela um INSERT, UPDATE ou um DELETE. Dentro de um trigger
AFTER você pode cancelar a ação utilizando um ROLLBACK. Você somente consegue criar triggers AFTER
em tabelas.

Já os novos triggers INSTEAD OF não fazem parte da transação que disparou o trigger. É como se eles
‘esquecem’ o comando que disparou o trigger, obrigando você e fazer um INSERT, UPDATE ou DELETE
manual dentro do trigger INSTEAD OF se você quer que a ação que disparou o trigger seja efetuada. Ele
trabalha da mesma maneira com as tabelas de memória INSERTED e DELETED e pode ser definido em
tabelas e views.

_________________________________________

Pergunta 23. Como cancelo a ação de um trigger?

Resposta: Se for um trigger AFTER (que é a tipo padrão de trigger se nada for mencionado no comando
CREATE TRIGGER) basta colocar um comando ROLLBACK, uma vez que o trigger está sendo executado
dentro da transação que o comando que disparou o trigger gerou.

Triggers INSTEAD OF ‘esquecem’ o comando que o disparou e não são colocados dentro da transação ,
evitando assim que se utilize o comando ROLLBACK para cancelar o comando que disparou o trigger.

_________________________________________

Pergunta 24. Mostre um exemplo de uma Stored Procedure que passa e recebe parâmetros.

Resposta: Stored Procedure podem retornar somente um valor, vários valores no formato de linhas e colunas ou
nenhum valor. Um exemplo de Stored Procedure que retornar somente um valor:

http://imasters.uol.com.br/artigo/1235/sql_server/25_principais_duvidas/imprimir/ 29/03/2008
iMasters - Por uma Internet mais criativa e dinâmica Página 7 de 7

CREATE PROCEDURE ST_QUADRADO @PAR1 INT , @RESULT INT OUTPUT


AS
BEGIN
SET @RESULT = @PAR1 * @PAR1
END

Para fazermos a chamada desta Stored Procedure devemos passar uma variável que conterá o valor do
resultado:

DECLARE @FINAL INT


EXEC ST_QUADRADO 4, @FINAL OUTPUT
SELECT @FINAL AS ‘RESULTADO’

_________________________________________

Pergunta 25. Posso fazer com que o resultado de uma Stored Proceduer seja inserido dentro de uma
tabela?

Resposta: Para fazer isso é somente necessário criar uma tabela com a mesma quantidade de campos e com os
tipos de dados compatívies com o retorno da sua Stored Procedure. Feito isso faça o comando INSERT chamar
a sua Stored Procedure. Por exemplo:

INSERT T_DADOS
EXEC ST_CALULA

http://imasters.uol.com.br/artigo/1235/sql_server/25_principais_duvidas/imprimir/ 29/03/2008

Você também pode gostar