Erros $#$%!

Problemas no Database Mail

Posted in Erros $#$%!, Vida Real on February 9th, 2009 by Silas Mendes – Be the first to comment

Você configurou o Database Mail, criou operadores, foi na propriedade Notifications do job e definiu um operador pra receber e-mail na ocorrência de uma falha; no entanto o e-mail não é enviado.

Você resolve dar uma olhada no log pra entender o que está acontecendo e então encontra a seguinte mensagem:

NOTE: Failed to notify ‘nome_do_operador’ via email.

Pra acertar isso va na propriedade Alert System do Sql Server Agent e marque a opção Enable mail profile. Pronto. Agora é só reiniciar o agent e seguir em frente :)

(Não esqueça de reiniciar o agent!)

Bom trabalho!

Erro na instalação do SQL 2008 (Parte II)

Posted in Erros $#$%!, Vida Real on November 4th, 2008 by Silas Mendes – 2 Comments

Depois de mais um tempo ausente volto pra falar sobre o erro da instalação do SQL Server 2008 no Windows XP (veja link do post aqui). Claro que esse não é o cenário ideal para instalação do SQL Server, mas se você quer instalá-lo no seu notebook ou PC, pra conhecer, estudar ou etc, então pode se deparar com o seguinte erro:

The Windows Installer service cannot update the system file C:\WINDOWS\system32\msxml6r.dll because the file is protected by Windows.  You may need to update your operating system for this program to work correctly.

Isso aconteceu comigo e depois de muitas pesquisas, agora em Outubro a Microsoft liberou um artigo falando sobre este erro.

Segundo o artigo, o erro ocorre quando tentamos instalar uma versão inglês do SQL Server (2005 ou 2008) num Windows XP SP3 não-inglês.

Solução? Não existe uma propriamente dita até o momento, mas se ao verificar o arquivo de log da instalação do SQL Server (na busca do Windows procure por SQLSetup*MSXML6*) você encontrar uma mensagem como está: “MSXML 6.0 Parser — Installation completed successfully.”, você poderá ignorar este erro.

Para ler o artigo na integra, acesse este link: http://support.microsoft.com/kb/958897

Bom trabalho, bons estudos!

Tutorial: Instalando o SQL Server 2008 Express.

Erro na instalação do SQL 2008 (Parte I)

Posted in Erros $#$%!, Vida Real on August 21st, 2008 by Silas Mendes – 2 Comments

Ontem baixei a versão final do SQL Server 2008 e instalei aqui.

A versão é a Enterprise (Trial) e tive dois problemas durante a instalação.

Um foi bem curioso, antes de iniciar a instalação o instalador informou que não poderia prosseguir porque existiam ferramentas do SQL Server 2005 Express instaladas e que para continuar a instalação eu deveria removê-las. O detalhe é que eu nunca instalei nenhuma versão Express nessa estação(!).

“The SQL Server 2005 Express Tools are installed. To continue, remove the SQL Server 2005 Express Tools.”

Ok… numa pesquisa rápida no fórum da Technet encontrei outros caras que já tiveram o mesmo problema e fiquei surpreso ao saber que o problema era devido a uma ferramenta que instalei, a SQL Prompt da Red Gate (essa ferramenta adiciona Intellisense no Query Analyser e SSMS). Bom, removi a ferramenta e o processo continuou normalmente…

…até eu encontrar outro erro:

The Windows Installer service cannot update the system file C:\WINDOWS\system32\msxml6r.dll because the file is protected by Windows.  You may need to update your operating system for this program to work correctly.

Nas buscas pelo google e technet vi que o assunto está sempre relacionado ao Windows XP e o SP2… vou começar alguns testes hoje a tarde. Se alguém aí já viveu essa situação e tem uma sugestão de como resolver deixe sua contribuição :)

Editado: Solução para este problema neste post:

Tutorial: Instalando o SQL Server 2008 Express.

Comparando text / ntext

Posted in Erros $#$%!, Vida Real on August 18th, 2008 by Silas Mendes – Be the first to comment

 

No SQL Server 2005 temos os novos campos do tipo VAR…(MAX) que vieram aliviar o trabalho de muita gente. Um dos problemas mais comuns na versão anterior (2000) é quando precisamos comparar dados de campos do tipo text ou ntext, aí nos deparamos com um erro do tipo:

Server: Msg 306, Level 16, State 1, Line 1

The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Eu já vivi essa situação algumas vezes e deixo aqui a forma como tentei resolver (Se tiverem outras sugestões fiquem a vontade para expor, ok?).

(Não fiz testes de perfomance nessa solução, o foco está somente em comparar as colunas tipo text / ntext.)

Imagine que eu tenha duas tabelas:

CREATE TABLE #tb_msg_tela
(id INT IDENTITY(1,1), texto TEXT)

GO

CREATE TABLE #tb_msg_impressao
(id INT IDENTITY(1,1), texto TEXT)

Com os seguintes dados:

INSERT INTO #tb_msg_tela VALUES (NULL)
INSERT INTO #tb_msg_tela VALUES (‘Campo text’)
INSERT INTO #tb_msg_tela VALUES (‘Teste comparação‘)
INSERT INTO #tb_msg_tela VALUES (‘Se caísse para o exterior, para o limite do universo, encontraria uma perto e pôsteres que indicassem BECO SEM SAÍDA?’)

INSERT INTO #tb_msg_impressao VALUES (”)
INSERT INTO #tb_msg_impressao VALUES (‘Campo text’)
INSERT INTO #tb_msg_impressao VALUES (‘Teste comparacao‘)
INSERT INTO #tb_msg_impressao VALUES (‘Se caisse para o esterior, p/ o limite do universo, encontraria uma perto e pôsteres que indicassem BECO SEM SAÍDA?’)

Observe que existem diferenças em alguns textos (em vermelho).

Para realizar o relacionamento das duas tabelas e encontrar os campos diferentes não podemos simplesmente utilizar:

SELECT * FROM #tb_msg_tela a, #tb_msg_impressao b
WHERE a.id = b.id AND a.texto <> b.texto

Essa consulta retornará um erro porque estamos comparando os campos text utilizando o <>.

Então o primeiro passo é encontrar o maior texto nessa coluna, para isso podemos usar as funções DATALENGHT e MAX:

SELECT MAX(DATALENGTH(texto)) FROM #tb_msg_tela
SELECT MAX(DATALENGTH(texto)) FROM #tb_msg_impressao

O resultado será:

———–

658

———–

656

Então sabemos que o maior texto dessa coluna não ultrapassa 700 caracteres, logo, podemos utilizar esse número como apoio no próximo passo, onde utilizaremos a função SUBSTRING:

SELECT
                *
FROM  
                #tb_msg_tela a,
                #tb_msg_impressao b
WHERE
                a.id = b.id
                AND ISNULL(SUBSTRING(a.texto, 0, 700),”) <> ISNULL(SUBSTRING(b.texto, 0, 700),”)

 

A função ISNULL é importante pois sem ela os campos Nulos serão ignorados.

Veja que a consulta só ira retornar os campos com as diferenças.

É um processo simples, mas que pode dar dor de cabeça por conta das limitações do tipo de dados. Pra quem ta iniciando o desenvolvimento utilizando o SQL Server 2005 a recomendação é: substitua os datatypes ntext, text, image por nvarchar(Max), varchar(Max) e varbinary(Max). Além de outras vantagens, com os novos datatypes não existem as antigas diferenças entre varchar e text.

 

SQL Server 2005 – Erro Import/Export

Posted in Erros $#$%!, Vida Real on August 7th, 2008 by Silas Mendes – 2 Comments

Os dias estão bem corridos e só hoje pude resolver aquele problema da importação via interface (SSMS) que ocorreu na semana passada. A mensagem de erro completa é esta:

The SSIS Runtime object could not be created. Verify that DTS.dll is available and registered. The wizard cannot continue and it will terminate.

Unable to cast COM object of type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.PackageNeutralClass’ to interface type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSContainer90′.

Procurei na internet e muita gente sugeriu a reinstalação das ferramentas, no entanto encontrei uma solução mais curta que resolveu de imediato, apenas registrei a dll, veja:

No menu Iniciar > Executar

regsvr32.exe  “C:\Arquivos de programas\Microsoft SQL Server\90\DTS\Binn\DTS.dll”

e enter :)

Pronto!

Inserindo registros via Bulk Insert

Posted in Erros $#$%!, Vida Real on July 25th, 2008 by Silas Mendes – 1 Comment

Realizar tarefas utilizando interfaces e nosso amigo (mickey) mouse pode ser muito confortável, no entanto, nem sempre elas estão disponíveis, ou em alguns cenários podem não ser a solução mais adequada.

Hoje pela manhã precisava importar dados para uma de nossas bases, a tarefa era urgentíssima, mas como sabemos, é justamente nessas horas que dá tudo errado! Meu Management Studio acordou mal humorado e quando cliquei na opção importar, ele disse sem pestanejar:

Unable to cast COM object of type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.PackageNeutralClass’ to interface type ‘Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSContainer90′ (…)

“Putz. Ok, hoje é sexta-feira, posso ir no Google e pesquisar sobre esse erro”. Enquanto pensava nisso meu gerente liga perguntando: “Já importou os dados?”…

Ok, vamos deixar o Google pra lá (por enquanto).

Existe uma forma muito prática de importar dados no SQL Server e foi a ela que recorri, o comando T-SQL é o BULK INSERT e é bem simples, veja o exemplo:

BULK INSERT tbTesteImport FROM ‘C:\arquivos_temp\tx_unid.txt’

WITH

(

FIRSTROW = 2,

FIELDTERMINATOR =‘;’

);

Neste caso o arquivo que eu precisava importar era o tx_unid.txt e ele foi gravado em C:\arquivos_temp do meu servidor SQL. Os dados desse arquivo foram importados para a tabela [tbTesteImport] e como ele tinha algumas particularidades tive que informar no BULK INSERT que ele deveria ignorar a primeira linha (era a linha de cabeçalho) e o caractere que separava um campo do outro era o ponto-e-vírgula (FIELDTERMINATOR =’;').

Pronto! Arquivo importado.

O BULK INSERT tem diversos parâmetros que você pode conferir aqui.

Em outra oportunidade irei comentar outras vantagens da utilização do BULK INSERT e também pretendo comentar sobre o BCP, mas agora vou ao Google ver se encontro o remédio pro mau humor do meu Management Studio :)

Até +

MSDE – Restaurar backup > que 2 GB

Posted in Erros $#$%!, Vida Real on July 4th, 2008 by Silas Mendes – Be the first to comment

(Essa é para os workaholics)

 

Chega sexta feira, você pega o backup da base de dados do serviço e leva pra casa pra adiantar o trabalho (ou correr atrás do prejuízo). Aí no sabadão, ao tentar restaurar o backup: ERRO.

Tenta o restore de novo e o mesmo erro. Sacanagem…

Então liga pra um amigo, pesquisa no Google e descobre: o MSDE tem uma limitação, não aceita bases de dados maiores que 2 GB!!

 

Ok, como (quase) tudo na vida, existe um “jeitinho” pra resolver isso, mas sinceramente não sugiro esse procedimento em nenhum ambiente de produção/homologação e etc. Repito: não sugiro esse procedimento em nenhum ambiente de produção/homologação e etc.

 

Para utilizar uma base > 2GB no MSDE você vai precisar dos arquivos MDF e LDF da sua base de dados original (a do seu trabalho). O procedimento é simples, mas tem contratempos, porque para copiar esses arquivos a base deve estar “desatachada” (ficou estranho mas não encontrei um termo mais apropriado) ou o serviço do SQL deve estar parado. Escolha uma das duas opções e copie os arquivos.

 

Na sua casa o procedimento vai ser o seguinte.

 

1 – No MSDE crie uma base de dados com o mesmo nome que ela tem em seu trabalho;

2 – Verifique onde os arquivos físicos da base foram criados;

3 – Pare o serviço do SQL Server;

4 – Pegue os arquivos MDF e LDF de seu serviço e cole (substitua!) os arquivos que o SQL acabou de criar para a sua nova base (é muito importante que os arquivos tenham o mesmo nome!);

5 – Inicie o serviço do SQL Server e …

 

Bom trabalho!

Executar DTS via código

Posted in Erros $#$%!, Vida Real on July 3rd, 2008 by Silas Mendes – 1 Comment

Uma dúvida muito comum:

Como executar um pacote DTS via código?

Muito simples… podemos a partir do DOS digitar o seguinte comando:

dtsrun /S nome_servidor /E /N nome_do_pacote

 

O pacote será executado.

Aí me perguntam: Ah, mas eu quero executar a partir do SQL Server!

Ok, existe a opção de utilizar a procedure xp_cmdshell para executar o mesmo comando. Ficaria mais ou menos assim:

EXEC master..xp_cmdshell ‘dtsrun /S nome_servidor /E /N nome_do_pacote’

Porém é bom deixar um alerta: Essa procedure só pode ser executada por sysadmins, e no SQL Server 2005 ela vem desabilitada, (se você quiser utilizá-la deverá realizar isso na SQL Server Surface Area). Isso tudo por razões de segurança, afinal ela tem o poder de executar comandos no sistema operacional… tire suas próprias conclusões sobre isso e pense se é viável habilitá-la em seu ambiente.

Pra finalizar, segue abaixo alguns parâmetros que podem ser interessantes na utilização do comando dtsrun:

  • Executar comando utilizando login do Windows:
    /E  (Conexão confiável)
  • Executar comando utilizando login do SQL:
    /U login /P senha
  • Se o pacote tiver uma senha:
    /M senha

Para ter acesso a uma relação completa digite apenas dtsrun no prompt do DOS e Enter ou acesse este link: http://msdn.microsoft.com/en-us/library/aa224467(SQL.80).aspx.

Até +

Modo de autenticação

Posted in Erros $#$%!, Vida Real on April 2nd, 2008 by Silas Mendes – 3 Comments

Existe uma situação famosa no Microsoft SQL Server que costuma dar trabalho a muitos iniciantes e até mesmo a alguns DBAs mais experientes.

Situação: Você acaba de instalar seu Microsoft SQL Server e logo no primeiro acesso surge o erro:

Login failed for user ‘sa’. The user is not associated with a trusted SQL Server connection. (Microsoft SQL Server, Error: 18452) 

Ok, isso acontece porque o SQL Server tem duas formas de autenticação: Autenticação Windows e Mixed Mode (Autenticação com login Windows e/ou login SQL Server), e por padrão, a instalação vem configurada como Windows Authentication, logo, quando o usuário tenta acessar a instância com um login do SQL Server (normalmente o famoso ‘SA’) o sistema manda aquela advertência.

Antes da solução, é bom frisar que por questões de segurança a Microsoft recomenda o modo Windows Authentication, mas se você quer/precisa usar o SA ou outro login criado diretamente no SQL Server, siga os seguintes passos:

Através do Microsoft SQL Server Management Studio (ou Enterprise Manager na versão 2000), clique sobre a instância (Nome do Servidor) com o botão direito e escolha a opção Properties. Na janela Server Properties, clique em Security; em Server authentication clique em SQL Server and Windows Authentication mode.

Pra concluir esta etapa clique no botão OK.

Depois disso o sistema apresenta a seguinte mensagem (que infelizmente nem todos os usuários lêem):

Some of your configuration changes will not take effect until SQL Server is restarted. 

Então é isso, para efetivar a alteração desta configuração é necessário reiniciar o serviço do SQL Server. Existem outras possíveis razões para a ocorrência deste erro, falarei sobre elas em outro dia.

Se eu não consegui te ajudar sugiro uma consulta ao Books Online ou aquela pesquisada básica no Google, ok?   

Um abraço e ótima semana.