Atualizando tabelas de systema SQL Server 2005 / 2008

Publicado: 20 de fevereiro de 2010 em T-SQL
Tags:

Ae galera sei que esse tópico podem gerar perguntas do tipo: Pra quê?…, Não vejo necessidade disso…, A própria Microsoft recomenda não realizar isso… Enfim, realmente a MS não recomenda nem dá suporte para atualizações de tabelas de sistema. Ela até mesmo bloqueou por padrão a alteração das mesmas.

No SQL Server 2000 o seguinte script permitia realizar alterações nas system tables:

 

–Altera a opção que permite atualizar tabelas de sistema
use master
GO
sp_configure ‘allow updates’,1
GO
reconfigure with override

–cria uma tabela
create table teste ( id int )

–Verifica a tabela criada

select * from sys.sysschobjs where name = ‘teste’

--atualiza a tabela de sistema
update sys.sysschobjs set name = 'teste_new' where name = 'teste'
 
No entanto, a partir do SQL Server 2005 a execução do código abaixo retorna um erro:

 

–atualiza a tabela de sistema
update sys.sysschobjs set name = ‘teste_new’ where name = ‘teste’

Msg 259, Level 16, State 1, Line 2
Ad hoc updates to system catalogs are not allowed.

 

Então como realizar as alterações nas nas versões do SQL Server posteriores ao 2000 ? Podemos “subir” o SQL em modo single user e conectar via DAC. Isso nos permite alterar tabelas de sistema.

Vejamos abaixo:

 

Precisamos primeiramente parar o serviço do SQL Server ( via linha de comando ou mesmo pelo Sql Server Configuration Manager )

Como o nome do meu serviço é MSSQLSERVER, o comando que devo executar é:

net stop MSSQLSERVER

 

E agora devemos localizar onde está a pasta BIN da instância que desejamos realizar as alterações, no meu caso é o seguinte:

 

C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn

 

Feito isso, vamos ao prompt de comando e executamos os seguintes comandos:

c:

cd\

cd C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn

Inicia  o SQL Server em single_user. No meu caso, como é uma instância padrão, não preciso informar a instância. Caso fosse uma instância nomeada com o nome de PROD deveríamos especificar o parâmetro –sPROD no comando abaixo:

sqlservr.exe –m

 

Agora se conecte ao SQL Server via DAC ( mais informações sobre acesso via DAC em http://msdn.microsoft.com/en-us/library/ms189595.aspx )

 

Instância padrão e autenticação Windows

sqlcmd –E –A

 

E agora execute o comando desejado:

 

update sys.sysschobjs set name = ‘teste_new’ where name = ‘teste’

GO

 

Note que o SQL Server alterou a tabela de sistema, mesmo sendo uma instância do 2008 no meu caso.

 

Daí no começo falei que muitas pessoas acham isso inútil e uma péssima prática. Sim realmente isso não deve ser usado normalmente mas em alguns casos é essencial.

Exemplo:

 

Imagine que você tenha um ambiente com replicação merge com um publisher e um subscriber ( ambos em SQL 7 ). E que você deseja migrar estes para SQL Server 2005. Daí você realiza um backup e faz um restore na instância 2005. No entanto você ainda não removeu a replicação de ambas as bases. Ao tentar executar a SP

 

sp_removedbreplication ‘nomeDaBase’

 

O SQl Server 2005 retornará inúmeros erros e não consegue remover a replicação. Como contornar ? Updates em tabelas de sistema:

 

UPDATE sysobjects set replinfo=0 WHERE replinfo<>0

 

Precisamos sempre saber o que podemos e devemos fazer e não apenas o que devemos…

 

Abraços galera.

Anúncios
comentários
  1. Laerte disse:

    Grande Demétrio…Novidade pra mim essa..parabéns cara , aprendi mais uma 🙂

  2. Gustavo disse:

    Oi Demétrio,É uma dica realmente interessante. Vi tantas vezes a Microsoft e outros papas de SQL Server negando que isso era possível que cheguei até a acreditar. Descobri que era possível quando dei uma folheada no MVP Deep Dives. Sem dúvida uma excelente dica.Abs,

  3. Felipe disse:

    Muito bom,Parabéns Demétrio!

  4. Demétrio disse:

    Olá Maia, Com certeza só postei porque você comentou comigo essa possibilidade e depois dei uma olhada na net e no livro.Abraços

Deixe um comentário

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

Logotipo do WordPress.com

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

Imagem do Twitter

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

Foto do Facebook

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

Foto do Google+

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

Conectando a %s