Источник:
http://feedproxy.google.com/~r/daxbr/~3/8oPh2pKZKbw/
==============
Caros,
Uma vez eu precisei ‘limpar’ um BD de produção, foi quando o Fraga ainda estava ajudando a Microsoft no suporte via
PrimeIT (já faz tempo!). O fato aconteceu porque os consultores tinham criado muitas empresas de teste na base de produção (pela facilidade de só trocar de empresa ao invés de abrir outra instância) e com isso trouxeram um prejuízo enorme quando fomos migrar de um release para outro, a ponto de termos que debugar processo de upgrade, até então, desconhecido para o suporte da MS Brasil! Acredito eu, que os consultores fazem isto por falta de informação, por não saberem como é o processo de upgrade, onde existem scripts de pré e pós sincronização que executam rotinas em muitas tabelas, uma vez para cada DataAreaId encontrado.
A solução que encontrei na época (e lembrei dela agora porque vi em outro artigo) foi vasculhar tabela por tabela procurando pelos DataAreaIDs que eu gostaria de apagar, o que resultou no sequinte script:
PHP код:
--Declarando as variáveis que irei usar
DECLARE @TABLE VARCHAR(100)
DECLARE @STATEMENT VARCHAR(500)
DECLARE LOCALTABLE CURSOR FOR SELECT NAME FROM SYS.TABLES
DECLARE @MYDATABASE VARCHAR(100)
DECLARE @MYCOMPANIES VARCHAR(100)
--Especificando a Base de Dados
SELECT @MYDATABASE = 'DAX_HOM'
--Especificando os DataAreaIds que eu quero apagar
SELECT @MYCOMPANIES = '(''VC1'', ''VC2'', ''VC3'')'
--Abrindo o Cursor
OPEN LOCALTABLE
--Carregando o Cursor pela Primeira vez
FETCH NEXT FROM LOCALTABLE INTO @TABLE
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
SET @STATEMENT = N'DELETE FROM [' + @MYDATABASE + '].[DBO].[' + @TABLE + '] WHERE [DATAAREAID] IN ' + @MYCOMPANIES
PRINT @STATEMENT
EXECUTE SP_EXECUTESQL @STATEMENT
END TRY
BEGIN CATCH
PRINT 'DataAreaID não encontrado na Tablea: ' + @TABLE
END CATCH
FETCH NEXT
FROM LOCALTABLE
INTO @TABLE
END
CLOSE LOCALTABLE
DEALLOCATE LOCALTABLE
Usei um cursor para navegar em todas as tabelas e, a partir daí, removo o que tiver o DataAreaId que quero, nas tabelas onde não há DataAreaId é gerada uma excessão que é tratada no CATCH e com isso a rotina faz a limpeza geral.
Nem preciso dizer o cuidado que deve ser tomado antes de rodar este comando né!?
[]s
Pichler
Источник:
http://feedproxy.google.com/~r/daxbr/~3/8oPh2pKZKbw/