terça-feira, 23 de novembro de 2010

Alterando o banco de dados padrão (default database) de um login

Todo login criado em um servidor SQL Server possui um banco de dados padrão (opção default database) configurado.

Este será o banco de dados ao qual o usuário irá se conectar sempre que não passar o banco de dados desejado no momento da conexão (como ocorre ao conectar-se utilizando o SQL Server Management Studio ou o Enterprise Manager)

Esta configuração pode impedir que o usuário se conecte ao servidor através das interfaces de gerenciamento (SSMS / Enterprise Manager / Query Analyzer) caso o banco de dados associado seja excluído. Neste caso, a mensagem "Cannot open user default database. Login failed" é exibida durante a tentativa de logon, como no exemplo abaixo:

"Cannot open user default database. Login failed"

Para contornar este problema, será necessário conectar-ser com outro usuário (cujo banco de dados padrão não tenha sido excluído) e executar a procedure sp_defaultdb, que configura o banco de dados padrão para um determinado usuário. 

Deve-se utilizar a seguinte sintaxe para esta procedure:

sp_defaultdb 'username', 'database'

Após a reconfiguração o usuário em questão passará a ter o banco de dados padrão informado.

Para evitar que este problema aconteça, é recomendado associar usuários a um banco de dados cuja exclusão seja pouco provável. O banco master pode ser uma alternativa para evitar este problema (lembrando que os usuários normais não devem ter permissões de alteração neste banco).

sexta-feira, 19 de novembro de 2010

Verificando se uma tabela temporária existe em um banco de dados

Ao trabalhar com scripts complexos, principalmente aqueles que podem ser executados mais de uma vez em uma mesma sessão no banco de dados, pode ser necessário verificar se uma tabela temporária já existe na base de dados.

Essa verificação não é tão trivial para tabelas temporárias quanto para as tabelas normais. Para tabelas normais, basta executar um SELECT na view sysobjects (para o SQL Server 2000 e 2005) ou na view INFORMATION_SCHEMA.TABLES (para o SQL Server 2008) filtrando o nome da tabela.

As views de sistema citadas acima guardam apenas informações sobre a base de dados a que pertencem. Sendo assim, não será possível utilizar a mesma verificação para as tabelas temporárias, uma vez que estas são armazanadas no tempdb.

Para contornar esta situação, pode-se verificar se uma tabela temporária existe através da função object_id(), que retorna o identificador único de um objeto no sistema cujo nome deve ser passado por parâmetro para a função. Caso o objeto não seja encontrado, a função retornará NULL.

No exemplo abaixo, verifica-se a existência da tabela #tmp e esta é excluída antes de ser criada novamente.

IF object_id('tempdb..#tmpPessoa') IS NOT NULL 
BEGIN
     DROP TABLE #tmpPessoa

END

CREATE TABLE #tmpPessoa
(
    id INT,

    nome VARCHAR(100)
)
GO


Observe que foi necessário passar o caminho completo da tabela temporária para que esta fosse encontrada (..).

sexta-feira, 5 de novembro de 2010

Dica: Espaço em disco ocupado por uma tabela

O administrador de uma bases de dados precisa possuir informações detalhadas sobre as tabelas de um banco para tomar decisões sobre a criação de índices, particionamentos, esquemas de backup, etc.

O número de linhas e o espaço ocupado por uma tabela são informações fundamentais em diversas situações. Pode-se encontrar esta informação através das propriedades da tabela no SQL Server Management Studio.

Para aqueles que preferem utilizar linha de comando, a procedure de sistema "sp_spaceused" pode auxiliar na obtenção destas informações. Esta procedure retorna as seguintes informações sobre uma tabela (cujo nome deve ser passado como parâmetro):

  • Número de linhas
  • Espaço em disco reservado para a tabela
  • Espaço em disco ocupado pelos dados 
  • Espaço em disco ocupado pelo índice
  • Espaço em disco livre

Veja no exemplo abaixo como utilizá-la:

EXEC sp_spaceused 'Production.Product'

O resultado obtido pelo comando acima pode ser observado na figura abaixo: