COMO REALIZAR UM DEPLOY DE VÁRIOS PACOTES SSIS PARA O MSDB USANDO O DEPLOYMENT UTILITY
BACKUP CUSTOMIZADO
master
exists(select 1 from sysobjects where name = ‘pr_backup’)
procedure pr_backup
proc pr_backup
varchar(50), — Informe o database para backup
varchar(500) = ‘C:’ , — Caminho default de backup, caso não seja declarado na chamada da procedure.
INT = 1, — Seleciona o tipo de backup. 1 = FULL , 2 = DIFERENCIAL , 3 = LOG
int = 30
table #backups (arquivos varchar(500))
@data varchar(12)
@cmd varchar(500) — Número de dias que serão ignorados os backups anteriores
@tipoBackup_name varchar(15)
@dataremocao varchar(12)
@dataremocao=CONVERT(varchar(12),dateadd(day,- @retencao,getdate()),112)
@tipoBackup = 1
begin
SET @tipoBackup_name = ‘Full’
END
@tipoBackup = 2
begin
SET @tipoBackup_name = ‘Diferencial’
END
@tipoBackup = 3
begin
SET @tipoBackup_name = ‘Log’
END
= ‘exec xp_cmdshell ‘+ ””+‘dir ‘+@localbackup+@database+‘-‘ +@tipoBackup_name+‘*.bkp’+””
#backups
@cmd)
varchar(100)
cursor for
substring(substring(arquivos,charindex(@database,arquivos)+LEN(@database)+LEN(@tipoBackup_name)+1,(LEN(arquivos)-(charindex(@database,arquivos)+LEN(@tipoBackup_name)))),1,12) as arquivos from #backups
charindex(@database,arquivos)<>0 and charindex(@database,arquivos) is not null)
(datetime,substring(substring(arquivos,charindex(@database,arquivos)+LEN(@database)+LEN(@tipoBackup_name)+1,(LEN(arquivos)-(charindex(@database,arquivos)+LEN(@tipoBackup_name)))),1,8)) <= @dataremocao
next from arq into @arq
@@FETCH_STATUS = 0
@cmd=‘xp_cmdshell ”del ‘+@localbackup+ @database+‘-‘+@tipoBackup_name+@arq+‘.bkp”’
(@cmd)
next from arq into @arq
arq
@tipoBackup = 1
begin
SET @tipoBackup_name = ‘Full’
set @data=CONVERT(varchar(14),GETDATE(),112)+REPLACE(CONVERT(VARCHAR(5),GETDATE(),108),‘:’,”)
set @cmd = ‘Backup database ‘+@database + ‘ to disk = ‘+””+@localbackup+”+@database+‘-‘+ @tipoBackup_name +@data+‘.bkp’+””
exec (@cmd)
print ”
print ”
print ‘Backup do database ‘+ @database + ‘Realizado em ‘+@localbackup+”+@database+‘-‘+@tipoBackup_name +@data+‘.bkp’
END
@tipoBackup = 2
begin
SET @tipoBackup_name = ‘Diferencial’
set @data=CONVERT(varchar(14),GETDATE(),112)+REPLACE(CONVERT(VARCHAR(5),GETDATE(),108),‘:’,”)
set @cmd = ‘Backup database ‘+@database + ‘ to disk = ‘+””+@localbackup +” +@database+‘-‘+ @tipoBackup_name +@data+‘.bkp’+”’ WITH DIFFERENTIAL’
exec (@cmd)
print ”
print ”
print ‘Backup do database ‘+ @database + ‘Realizado em ‘+@localbackup+” +@database+‘-‘+@tipoBackup_name +@data+‘.bkp’
END
@tipoBackup = 3
begin
SET @tipoBackup_name = ‘Log’
set @data=CONVERT(varchar(14),GETDATE(),112)+REPLACE(CONVERT(VARCHAR(5),GETDATE(),108),‘:’,”)
set @cmd = ‘Backup LOG ‘+@database + ‘ to disk = ‘+””+@localbackup+” +@database+‘-‘+ @tipoBackup_name +@data+‘.bkp’+””
exec (@cmd)
print ”
print ”
print ‘Backup do LOG do database ‘+ @database + ‘ Realizado em ‘+@localbackup+” +@database+‘-‘+@tipoBackup_name +@data+‘.bkp’
END
pr_backup
DOCUMENTAÇÃO DE PROCEDURES E TRIGGERS
create table documentacao
(objetoid int primary key,
nome_objecto varchar(250),
Objeto_referencia varchar(250),
tipo char(1),
dt_criacao datetime,
script text)
go
as
set nocount on
declare @cmd varchar(1000),@objeto varchar(250),@objeto_referencia varchar(250),@criacao datetime,@id int,@tipo char(1),@script varchar(8000)
declare obj cursor for
select o.id,o.name,object_name(o.parent_obj),o.crdate,o.xtype,c.text from sysobjects o, syscomments c where c.id=o.id
open obj
fetch next from obj into @id,@objeto,@objeto_referencia,@criacao,@tipo,@script
while @@fetch_status=0
begin
insert into documentacao(objetoid,nome_objecto,Objeto_referencia,dt_criacao,tipo,script)
select @id,@objeto,@objeto_referencia,@criacao,@tipo,@script where @id not in(select objetoid from documentacao )
end
close obj
deallocate obj
go
TRIGGER DE AUTO-INCREMENTO
create table tel_pac
(cod_pac int not null,
tel int not null)
go
alter table tel_pac add constraint pk_codpac primary key(cod_pac)
go
create trigger auto_num
on tel_pac
instead of insert
as
declare @cod int,@tel int
select @cod = case when max(cod_pac) is null then 1 else max(cod_pac)+1 end from tel_pac(xlock)
select @tel=i.tel from inserted i
insert into tel_pac(cod_pac,tel) values (@cod,@tel)
VISUALISAR SALDO
table mov_data
codigo int identity,
int not null,
char(1),
datetime,
float)
into mov_data(codigo_conta,tipo,data,valor) values(1,‘C’,’10/10/2008′,100)
into mov_data(codigo_conta,tipo,data,valor) values(1,‘C’,’10/10/2008′,100)
into mov_data(codigo_conta,tipo,data,valor) values(1,‘D’,’11/10/2008′,50)
into mov_data(codigo_conta,tipo,data,valor) values(1,‘D’,’12/10/2008′,100)
into mov_data(codigo_conta,tipo,data,valor) values(2,‘D’,’12/10/2008′,100)
into mov_data(codigo_conta,tipo,data,valor) values(2,‘D’,’12/10/2008′,100)
into mov_data(codigo_conta,tipo,data,valor) values(2,‘D’,’12/10/2008′,100)
into mov_data(codigo_conta,tipo,data,valor) values(2,‘C’,’12/10/2008′,300)
a.codigo,a.codigo_conta,a.tipo,a.data,a.valor,
(select sum(b.valor)
from (select codigo,codigo_conta,case when tipo = ‘C’ then valor else –valor end valor from mov_data) b
where a.codigo>=b.codigo and a.codigo_conta=b.codigo_conta) as Saldo
mov_data a
by a.codigo
Resultados do select: Cod CC Tipo Data Valor Saldo 1 1 C 20081010 100 100 2 1 C 20081010 100 200 3 1 D 20081110 50 150 4 1 D 20081210 100 50 5 2 D 20081210 100 -100 6 2 D 20081210 100 -200 7 2 D 20081210 100 -300 8 2 C 20081210 300 0
REMOVER ACENTUAÇÃO USANDO REPLACE
Table #Textos (Indice int identity(1,1), Texto VarChar(1000))
Into #Textos (Texto) Values (‘teste teste é, teste teste á’)
Into #Textos (Texto) Values (‘teste teste é, ãõâêî teste á’)
Into #Textos (Texto) Values (‘teste ãõâêî é, teste teste á’)
Into #Textos (Texto) Values (‘teste teste á, ãõâêî’)
Into #Textos (Texto) Values (‘teste teste’)
table #TabelaAcentos (Indice Int Identity(1,1), Acento char(01), SemAcento Char(01))
Into #TabelaAcentos (Acento, SemAcento ) Values (‘á’,‘a’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘é’,‘e’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘í’,‘i’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ó’,‘o’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ú’,‘u’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘à’,‘a’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘è’,‘e’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ì’,‘i’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ò’,‘o’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ù’,‘u’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ã’,‘a’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘õ’,‘o’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘â’,‘a’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ê’,‘e’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘î’,‘i’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ô’,‘o’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘û’,‘u’)
Into #TabelaAcentos (Acento, SemAcento ) Values (‘ç’,‘c’)
@id int,@id_acento int,@old_char char(1), @new_char char(1),@texto varchar(1000)
@id=1
@id <= (select COUNT(1) from #Textos)
@texto=Texto from #Textos where indice=@id
set @id_acento=1
while @id_acento <= (select count(1) from #TabelaAcentos)
begin
select @old_char=Acento, @new_char=SemAcento from #TabelaAcentos where Indice=@id_acento
set @texto=REPLACE(@Texto,@old_char,@new_char)
set @id_acento=@id_acento+1
end
select @texto
@id=@id+1
ÍNDICES E ESTATÍSTICAS
Hoje, me deparei com uma dúvida de um dos participantes do fórum "FÓRUM DA RM" e essa dúvida era sobre como funcionavam os índices e estatísticas.
Vou tentar, explicar como funcionam as estatísticas e os índices. Primeiramente, vou me abster a contextualizar sobre os diferentes tipos de índices (clustered, nonclustered e unique), prometo que meu próximo assunto abordado dará ênfase aos tipos de estatísticas e como criá-los.
Os índices de uma tabela são como os índices de um livro, eles indicam onde encontrar o que você está procurando.
O SQL permite criar vários índices em uma mesma tabela, de forma que você pode organizar os dados na ordem que quiser, exemplo:
se você cria um índice que organiza os dados por data, no momento que realiza consultas por data, o resultado será o melhor possível, pois o SQL irá utilizar o índice que você criou por data.
Se criar outro índice que organiza a tabela por código do movimento, quando realizar consultas que pesquisem por ordem de código de movimento, a consulta irá ser rápida, pois os índices irão apontar para as informações de forma correta.
Mas, como o SQL sabe qual índice utilizar quando você está realizando uma consulta em uma tabela que possui mais de um índice?
Resposta: ESTATÍSTICAS!!!
As estatísticas são contadores que informam para o SQL quais são os melhores índices ou os índices mais rápidos. O SQL sabe quais são os melhores índices baseado num contador sobre os campos que compõem os índices, os índices que possuem campos com maior seletividade são escolhidos e a consulta executa feito uma BALA!!!
Para isso, você deve criar estatísticas para os índices, não adianta ter índices sem uma boa estatísticas.
Realizando uma verificação do plano de execução de qualquer consulta, você pode verificar a inexistência de índice e criá-los. Outra forma é o Index Tuning wizard(SQL2000) ou o DTA(SQL2005), que sugere ou cria índices e estatísticas automaticamente.
O FullScan comentado pelo colega Mafra, só é realizado quando não existem índices para os dados que estão sendo pesquisados, quando as estatísticas não existem, são ineficientes ou estão desatualizadas. Pra ver como a falta de estatísticas é crucial, imagine a seguinte situação:
Você chega em uma biblioteca e vai procurar o assunto "Atualização de estatísticas" pesquisando nos índices de todos os livros de informática relacionados com banco de dados, até encontrar um livro que tenha o assunto no índice pode demorar bastante. Apesar de todos os livros possuírem índices isso não quer dizer que você irá encontrar rapidamente o que quer.
Agora, se a biblioteca possui uma estatística, onde você pode realizar a seguinte consulta: quais os livros que possuem o assunto "Atualização de estatísticas" no índice? Se existir essa estatística, você irá direto para os livros certos, sem perder muito tempo.
Se, por acaso, não existirem as estatísticas, você até pode encontrar os livros que contém o assunto, porém, se não existir nem estatística e nem índices, você estará perdido! Terá que verificar todas as folhas de todos os livros para encontrar o assunto "Atualização de estatísticas”, rsrsrsrs.
Então, tão importante quanto criar índices e estatísticas é a manutenção delas. Realize, diariamente, reindexação dos índices de todas as tabelas e atualize as estatísticas também para todos os objetos.
Espero ter lhe ajudado,
Emanuel Peixoto.