/* 1º Parte */
SP_DROPUSER SYSDBA
GO
EXEC SP_CHANGEDBOWNER sa
GO
/* 2º Parte */
/* Criação dos usuários RM e SYSDBA */
IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'rm')
CREATE LOGIN rm WITH PASSWORD = 'rm',CHECK_POLICY=OFF
GO
EXEC SP_CHANGEDBOWNER rm
GO
IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'sysdba')
CREATE LOGIN sysdba WITH PASSWORD = 'masterkey',CHECK_POLICY=OFF
GO
sp_adduser sysdba,sysdba
GO
GRANT SELECT ON GPARAMS TO sysdba
GO
GRANT SELECT , UPDATE ON GUSUARIO TO sysdba
GO
GRANT SELECT ON GPERMIS TO sysdba
GO
GRANT SELECT ON GACESSO TO sysdba
GO
GRANT SELECT ON GSISTEMA TO sysdba
GO
GRANT SELECT ON GCOLIGADA TO sysdba
GO
GRANT SELECT ON GUSRPERFIL TO sysdba
GO
GRANT SELECT ON GSERVICO TO sysdba
GO
GRANT SELECT ON GPARAMETROSSISTEMA TO sysdba
GO
GRANT SELECT,INSERT ON GDATALOG TO sysdba
GO
GRANT SELECT ON GMAILPARAMS TO sysdba
GO
GRANT SELECT ON GUPGATUALIZACAO TO sysdba
GO
GRANT SELECT,INSERT,DELETE,UPDATE ON GSESSAOFLUIG TO sysdba
GO
GRANT SELECT,INSERT,DELETE,UPDATE ON GULTIMOCONTEXTOUSUARIO TO sysdba
GO
SP_DEFAULTLANGUAGE 'RM','ENGLISH'
GO
SP_DEFAULTLANGUAGE 'SYSDBA','ENGLISH'
GO
Mostrando postagens com marcador RM. Mostrar todas as postagens
Mostrando postagens com marcador RM. Mostrar todas as postagens
domingo, 6 de agosto de 2017
Totvs - RM - Usuários - MSSQL 2012
/* 1º Parte */
SP_DROPUSER SYSDBA
GO
EXEC SP_CHANGEDBOWNER sa
GO
/* 2º Parte */
/* Criação dos usuários RM e SYSDBA */
IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'rm')
CREATE LOGIN rm WITH PASSWORD = 'rm',CHECK_POLICY=OFF
GO
EXEC SP_CHANGEDBOWNER rm
GO
IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'sysdba')
CREATE LOGIN sysdba WITH PASSWORD = 'masterkey',CHECK_POLICY=OFF
GO
sp_adduser sysdba,sysdba
GO
GRANT SELECT ON GPARAMS TO sysdba
GO
GRANT SELECT , UPDATE ON GUSUARIO TO sysdba
GO
GRANT SELECT ON GPERMIS TO sysdba
GO
GRANT SELECT ON GACESSO TO sysdba
GO
GRANT SELECT ON GSISTEMA TO sysdba
GO
GRANT SELECT ON GCOLIGADA TO sysdba
GO
GRANT SELECT ON GUSRPERFIL TO sysdba
GO
GRANT SELECT ON GSERVICO TO sysdba
GO
GRANT SELECT ON GPARAMETROSSISTEMA TO sysdba
GO
SP_DROPUSER SYSDBA
GO
EXEC SP_CHANGEDBOWNER sa
GO
/* 2º Parte */
/* Criação dos usuários RM e SYSDBA */
IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'rm')
CREATE LOGIN rm WITH PASSWORD = 'rm',CHECK_POLICY=OFF
GO
EXEC SP_CHANGEDBOWNER rm
GO
IF NOT EXISTS(SELECT * FROM MASTER.DBO.SYSLOGINS WHERE NAME = 'sysdba')
CREATE LOGIN sysdba WITH PASSWORD = 'masterkey',CHECK_POLICY=OFF
GO
sp_adduser sysdba,sysdba
GO
GRANT SELECT ON GPARAMS TO sysdba
GO
GRANT SELECT , UPDATE ON GUSUARIO TO sysdba
GO
GRANT SELECT ON GPERMIS TO sysdba
GO
GRANT SELECT ON GACESSO TO sysdba
GO
GRANT SELECT ON GSISTEMA TO sysdba
GO
GRANT SELECT ON GCOLIGADA TO sysdba
GO
GRANT SELECT ON GUSRPERFIL TO sysdba
GO
GRANT SELECT ON GSERVICO TO sysdba
GO
GRANT SELECT ON GPARAMETROSSISTEMA TO sysdba
GO
segunda-feira, 7 de novembro de 2016
TOTVS RM - CONVERTENDO CAMPO HORA (PFFINANC) PARA FORMATO DE TELA
select
codcoligada,
chapa,
anocomp,
mescomp,
nroperiodo,
ref,
hora,
valor,
(hora/60.0) hora_base_calc,
floor(hora/(60.0)) hora_oficial,
(hora/60.0) - floor(hora/(60.0)) minutos_base_calc,
(((hora/60.0) - floor(hora/(60.0))) * 60) minutos_base_calc2,
round((((hora/60.0) - floor(hora/(60.0))) * 60),1) minutos_oficial,
floor(hora/(60.0)) +
(round((((hora/60.0) - floor(hora/(60.0))) * 60),1))/100 HORA_TELA
from pffinanc
where hora > 0
sexta-feira, 11 de março de 2016
TOTVS RM - Falha na verificação da base de dados! A base de dados está bloqueada para uso em razão de erros no processo de atualização das versões a seguir:...
Falha na verificação da base de dados! A base de dados está bloqueada para uso em razão de erros no processo de atualização das versões a seguir:...
Causa: Este erro é apresentado no momento de acesso ao sistema, pois durante o processo de conversão de versão foram apresentados erros e não foram corrigidos.
Solução:
Não existe um processo de solução.
Para analisar o log da conversão:
Análise o log de erros normalmente encontrado no diretório \TOTVS\CORPORERM\RM.NET\ATUALIZADOR\LOG.
Este arquivo é criptografado, e você pode analisá-lo com o programa "RM.Atualizador.LogViewer.exe", localizado em \TOTVS\CORPORERM\RM.NET
Verifique o erro apresentado, corrija a base de dados, e refaça a conversão.
Tabela GUPGATUALIZACAO.
Esta tabela armazena os resultados dos logs de conversão e faz a restrição do acesso ao sistema.
Causa: Este erro é apresentado no momento de acesso ao sistema, pois durante o processo de conversão de versão foram apresentados erros e não foram corrigidos.
Solução:
Não existe um processo de solução.
Para analisar o log da conversão:
Análise o log de erros normalmente encontrado no diretório \TOTVS\CORPORERM\RM.NET\ATUALIZADOR\LOG.
Este arquivo é criptografado, e você pode analisá-lo com o programa "RM.Atualizador.LogViewer.exe", localizado em \TOTVS\CORPORERM\RM.NET
Verifique o erro apresentado, corrija a base de dados, e refaça a conversão.
Tabela GUPGATUALIZACAO.
Esta tabela armazena os resultados dos logs de conversão e faz a restrição do acesso ao sistema.
sábado, 29 de agosto de 2015
RM - Dias Úteis
Dias Uteis (SQL)
-DROP FUNCTION DIASUTEISMES
--CREATE FUNCTION DIASUTEISMES (@MES INT, @ANO INT, @CODCOLIGADA DCODCOLIGADA, @CHAPA DCHAPA)
--RETURNS INT
--AS BEGIN
DECLARE @CODCOLIGADA DCODCOLIGADA
DECLARE @CHAPA DCHAPA
DECLARE @MES INT
DECLARE @ANO INT
DECLARE @MESPROX INT
DECLARE @ANOPROX INT
DECLARE @DIATEMP INT
DECLARE @DATATEMP DATETIME
DECLARE @STATUSDATA DATETIME
DECLARE @FERIADO INT
DECLARE @COMPDESC INT
DECLARE @DIASUTEIS INT
DECLARE @DATASTRING VARCHAR(10)
SET @MES = 10
SET @ANO = 2003
SET @CODCOLIGADA = 1
SET @CHAPA = '931.00595'
-----------------------------------------------------------------------------------------
-- PROXIMO MÊS E ANO
-----------------------------------------------------------------------------------------
IF @MES = 12
BEGIN
SET @MESPROX = 1
SET @ANOPROX = @ANO+1
END
ELSE
BEGIN
SET @MESPROX = @MES+1
SET @ANOPROX = @ANO
END
PRINT 'MÊS E ANO PARA QUAL SERÁ COMPRADO O BENEFÍCIO'
PRINT 'PRÓXIMO MÊS: '+CAST(@MESPROX AS VARCHAR)
PRINT 'PRÓXIMO ANO: '+CAST(@ANOPROX AS VARCHAR)
PRINT '----------------------------------------'
-----------------------------------------------------------------------------------------
-- DIA COMPENSADO E DIA DE DESCANSO (SÁBADO E DOMINGO)
-----------------------------------------------------------------------------------------
-- ULTIMO DIA DO MES PROXIMO (SEJA 31, 30 OU 28)
SET @DATASTRING = (SELECT CAST(@MESPROX AS VARCHAR) + '/1/'+ CAST(@ANOPROX AS VARCHAR))
SET @DATATEMP = (SELECT DATEADD(MONTH,1,(CAST(@DATASTRING AS DATETIME))))-1
PRINT 'DATA LIMITE DA COMPRA DO BENEFÍCIO : '+ CAST(@DATATEMP AS VARCHAR)
PRINT '----------------------------------------'
-- CÁLCULO DE SÁBADOS E DOMINGOS
SET @DIATEMP = 0
SET @COMPDESC = 0
WHILE @DIATEMP < DATEPART(DD, @DATATEMP)
BEGIN
SET @DATASTRING = (SELECT CAST(@MESPROX AS VARCHAR) + '/'+ CAST(DATEPART(DD,@DIATEMP)AS VARCHAR) + '/'+CAST(@ANOPROX AS VARCHAR))
--PRINT 'DATA STRING 2: ' + @DATASTRING
SET @STATUSDATA = CAST(@DATASTRING AS DATETIME)
--PRINT 'DATA DATETIME 2: ' + CAST(@STATUSDATA AS VARCHAR)
--PRINT '----------------------------------------'
IF (DATENAME(WEEKDAY,@STATUSDATA) = 'Saturday') OR (DATENAME(WEEKDAY,@STATUSDATA) = 'Sunday')
BEGIN
SET @COMPDESC = @COMPDESC+1
END
SET @DIATEMP = @DIATEMP+1
END
-----------------------------------------------------------------------------------------
-- FERIADOS
-----------------------------------------------------------------------------------------
SET @FERIADO = 0
SET @FERIADO = (SELECT COUNT(*)
FROM GFERIADO
WHERE CODCALENDARIO = (SELECT CODCALENDARIO
FROM PSECAO
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODIGO = (SELECT CODSECAO
FROM PFUNC
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA))
AND DATEPART(MM,DIAFERIADO) = @MESPROX
AND DATEPART(YYYY,DIAFERIADO) = @ANOPROX)
-----------------------------------------------------------------------------------------
-- DIAS UTEIS
-----------------------------------------------------------------------------------------
SET @DIATEMP = 0
SET @DIATEMP = CAST(DATEPART(DD,@DATATEMP)AS INT)
PRINT 'QTD DE DIAS DO MES DE COMPRA BENEFICIO: ' + CAST(DATEPART(DD, @DATATEMP) AS VARCHAR)
PRINT 'QTD DE DIAS DE FERIADO DE COMPRA BENEFICIO: ' + CAST(@FERIADO AS VARCHAR)
PRINT 'QTD DE DIAS DE COMPENSADOS DE COMPRA DE BENEFICIO: ' + CAST(@COMPDESC AS VARCHAR)
SET @DIASUTEIS = (@DIATEMP - @FERIADO - @COMPDESC)
PRINT 'QTD DE DIAS UTEIS DO MES DE COMPRA DE BENEFICIO: ' + CAST(@DIASUTEIS AS VARCHAR)
--RETURN @DIASUTEIS
--END
-DROP FUNCTION DIASUTEISMES
--CREATE FUNCTION DIASUTEISMES (@MES INT, @ANO INT, @CODCOLIGADA DCODCOLIGADA, @CHAPA DCHAPA)
--RETURNS INT
--AS BEGIN
DECLARE @CODCOLIGADA DCODCOLIGADA
DECLARE @CHAPA DCHAPA
DECLARE @MES INT
DECLARE @ANO INT
DECLARE @MESPROX INT
DECLARE @ANOPROX INT
DECLARE @DIATEMP INT
DECLARE @DATATEMP DATETIME
DECLARE @STATUSDATA DATETIME
DECLARE @FERIADO INT
DECLARE @COMPDESC INT
DECLARE @DIASUTEIS INT
DECLARE @DATASTRING VARCHAR(10)
SET @MES = 10
SET @ANO = 2003
SET @CODCOLIGADA = 1
SET @CHAPA = '931.00595'
-----------------------------------------------------------------------------------------
-- PROXIMO MÊS E ANO
-----------------------------------------------------------------------------------------
IF @MES = 12
BEGIN
SET @MESPROX = 1
SET @ANOPROX = @ANO+1
END
ELSE
BEGIN
SET @MESPROX = @MES+1
SET @ANOPROX = @ANO
END
PRINT 'MÊS E ANO PARA QUAL SERÁ COMPRADO O BENEFÍCIO'
PRINT 'PRÓXIMO MÊS: '+CAST(@MESPROX AS VARCHAR)
PRINT 'PRÓXIMO ANO: '+CAST(@ANOPROX AS VARCHAR)
PRINT '----------------------------------------'
-----------------------------------------------------------------------------------------
-- DIA COMPENSADO E DIA DE DESCANSO (SÁBADO E DOMINGO)
-----------------------------------------------------------------------------------------
-- ULTIMO DIA DO MES PROXIMO (SEJA 31, 30 OU 28)
SET @DATASTRING = (SELECT CAST(@MESPROX AS VARCHAR) + '/1/'+ CAST(@ANOPROX AS VARCHAR))
SET @DATATEMP = (SELECT DATEADD(MONTH,1,(CAST(@DATASTRING AS DATETIME))))-1
PRINT 'DATA LIMITE DA COMPRA DO BENEFÍCIO : '+ CAST(@DATATEMP AS VARCHAR)
PRINT '----------------------------------------'
-- CÁLCULO DE SÁBADOS E DOMINGOS
SET @DIATEMP = 0
SET @COMPDESC = 0
WHILE @DIATEMP < DATEPART(DD, @DATATEMP)
BEGIN
SET @DATASTRING = (SELECT CAST(@MESPROX AS VARCHAR) + '/'+ CAST(DATEPART(DD,@DIATEMP)AS VARCHAR) + '/'+CAST(@ANOPROX AS VARCHAR))
--PRINT 'DATA STRING 2: ' + @DATASTRING
SET @STATUSDATA = CAST(@DATASTRING AS DATETIME)
--PRINT 'DATA DATETIME 2: ' + CAST(@STATUSDATA AS VARCHAR)
--PRINT '----------------------------------------'
IF (DATENAME(WEEKDAY,@STATUSDATA) = 'Saturday') OR (DATENAME(WEEKDAY,@STATUSDATA) = 'Sunday')
BEGIN
SET @COMPDESC = @COMPDESC+1
END
SET @DIATEMP = @DIATEMP+1
END
-----------------------------------------------------------------------------------------
-- FERIADOS
-----------------------------------------------------------------------------------------
SET @FERIADO = 0
SET @FERIADO = (SELECT COUNT(*)
FROM GFERIADO
WHERE CODCALENDARIO = (SELECT CODCALENDARIO
FROM PSECAO
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODIGO = (SELECT CODSECAO
FROM PFUNC
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA))
AND DATEPART(MM,DIAFERIADO) = @MESPROX
AND DATEPART(YYYY,DIAFERIADO) = @ANOPROX)
-----------------------------------------------------------------------------------------
-- DIAS UTEIS
-----------------------------------------------------------------------------------------
SET @DIATEMP = 0
SET @DIATEMP = CAST(DATEPART(DD,@DATATEMP)AS INT)
PRINT 'QTD DE DIAS DO MES DE COMPRA BENEFICIO: ' + CAST(DATEPART(DD, @DATATEMP) AS VARCHAR)
PRINT 'QTD DE DIAS DE FERIADO DE COMPRA BENEFICIO: ' + CAST(@FERIADO AS VARCHAR)
PRINT 'QTD DE DIAS DE COMPENSADOS DE COMPRA DE BENEFICIO: ' + CAST(@COMPDESC AS VARCHAR)
SET @DIASUTEIS = (@DIATEMP - @FERIADO - @COMPDESC)
PRINT 'QTD DE DIAS UTEIS DO MES DE COMPRA DE BENEFICIO: ' + CAST(@DIASUTEIS AS VARCHAR)
--RETURN @DIASUTEIS
--END
Marcadores:
CorporeRM; MDI,
Dias Uteis,
Feriados,
RM,
Sabados e Domingos
RM - Coligada Corrente
select ultimacoligada as coligadacorrente
from gusuario
where codusuario = (select username
from glogin
where computername = (select distinct hostname
from master..sysprocesses
where spid = (select @@spid))
and datepart(yyyy,logintime) = (select distinct datepart(yyyy, getdate()) from gcoligada)
and datepart(mm,logintime) = (select distinct datepart(mm, getdate()) from gcoligada)
and datepart(dd,logintime) = (select distinct datepart(dd, getdate()) from gcoligada))
from gusuario
where codusuario = (select username
from glogin
where computername = (select distinct hostname
from master..sysprocesses
where spid = (select @@spid))
and datepart(yyyy,logintime) = (select distinct datepart(yyyy, getdate()) from gcoligada)
and datepart(mm,logintime) = (select distinct datepart(mm, getdate()) from gcoligada)
and datepart(dd,logintime) = (select distinct datepart(dd, getdate()) from gcoligada))
SQL / RM - Erros C#
-- Script para remoção dos erros do C# como por exemplo
-- Couldn't perform the edit because another user changed the record.
-- ATENÇÃO: ESTE NÃO DEVE SER EXECUTADO SE O BANCO FIZER BACKUP DE LOG
set nocount on
declare @comando varchar(255)
declare @comando1 varchar(255)
declare @comando2 varchar(255)
declare @comando3 varchar(255)
declare @comando4 varchar(255)
declare @database varchar(100)
declare @datab varchar(50)
set @datab = (select distinct table_catalog from information_schema.tables)
if (select count(*) from master.dbo.sysprocesses where dbid in ( select dbid from master.dbo.sysdatabases where name = @datab )) <= 1
begin
print ' '
print 'Acertando permissões do banco.'
exec sp_dboption @datab, 'single', 'true'
exec sp_dboption @datab, 'trunc. log on chkpt.', 'true'
exec sp_dboption @datab, 'auto create statistics', 'false'
exec sp_dboption @datab, 'auto update statistics', 'false'
exec sp_dboption @datab, 'ansi null default', 'true'
print ' '
print 'Verificando base de dados.'
set @comando1 ='dbcc checkdb ('+@datab+')'
exec (@comando1)
print ' '
print 'Acertando fragmentação na base de dados.'
set @comando3= 'dbcc newalloc ('+@datab+')'
exec (@comando3)
declare @tabela varchar (100)
declare @comando5 varchar (255)
declare tabela cursor for
select name from sysobjects where type = 'u' order by name
open tabela
fetch next from tabela into @tabela
while @@fetch_status = 0
begin
print ''
print 'Verificando tabela '+@tabela
print ''
set @comando5 = 'dbcc checktable ('+@tabela +', repair_allow_data_loss)'
exec (@comando5)
set @comando = 'dbcc dbreindex ('+@tabela+')'
exec (@comando5)
set @comando5= 'dbcc checkconstraints ('+@tabela+')'
exec (@comando5)
fetch next from tabela into @tabela
end
close tabela
deallocate tabela
exec sp_dboption @datab, 'single', 'false'
declare @tab_nome varchar(255)
declare @tab_statistic varchar(255)
declare @sql_str varchar(255)
declare @db_nome varchar(255)
select @db_nome=name from master..sysdatabases where dbid=(select dbid from master..sysprocesses where spid=@@spid)
checkpoint
declare cur cursor for
select object_name(id),name from sysindexes where name like '_wa_sys%'
set nocount on
open cur
fetch next from cur into @tab_nome,@tab_statistic
while(@@fetch_status=0)
begin
set @sql_str='drop statistics ' + @tab_nome + '.' + @tab_statistic
exec (@sql_str)
fetch next from cur into @tab_nome,@tab_statistic
end
close cur
deallocate cur
exec sp_updatestats
print '*******************************************************************************************'
print 'FINAL DA MANUNTENCAO'
print '*******************************************************************************************'
end
else
begin
print '****** A T E N Ç Â O *******'
print 'A BASE ESTÁ SENDO USADA. ESTE SCRIPT SÓ PODE SER EXECUTADO EM MONOUSUÁRIO !!!'
print '***********************************************************************************************************************'
print 'Seguintes estações/número de conexões estão acessado a base de dados:'
declare @tab varchar(20)
declare @num varchar(2)
declare tabs cursor for select hostname,count(*) from master.dbo.sysprocesses where dbid in ( select dbid from master.dbo.sysdatabases where name = @datab ) group by hostname
open tabs
fetch next from tabs into @tab,@num
while(@@fetch_status=0)
begin
print @tab +'/'+@num
fetch next from tabs into @tab,@num
end
close tabs
deallocate tabs
end
-- Couldn't perform the edit because another user changed the record.
-- ATENÇÃO: ESTE NÃO DEVE SER EXECUTADO SE O BANCO FIZER BACKUP DE LOG
set nocount on
declare @comando varchar(255)
declare @comando1 varchar(255)
declare @comando2 varchar(255)
declare @comando3 varchar(255)
declare @comando4 varchar(255)
declare @database varchar(100)
declare @datab varchar(50)
set @datab = (select distinct table_catalog from information_schema.tables)
if (select count(*) from master.dbo.sysprocesses where dbid in ( select dbid from master.dbo.sysdatabases where name = @datab )) <= 1
begin
print ' '
print 'Acertando permissões do banco.'
exec sp_dboption @datab, 'single', 'true'
exec sp_dboption @datab, 'trunc. log on chkpt.', 'true'
exec sp_dboption @datab, 'auto create statistics', 'false'
exec sp_dboption @datab, 'auto update statistics', 'false'
exec sp_dboption @datab, 'ansi null default', 'true'
print ' '
print 'Verificando base de dados.'
set @comando1 ='dbcc checkdb ('+@datab+')'
exec (@comando1)
print ' '
print 'Acertando fragmentação na base de dados.'
set @comando3= 'dbcc newalloc ('+@datab+')'
exec (@comando3)
declare @tabela varchar (100)
declare @comando5 varchar (255)
declare tabela cursor for
select name from sysobjects where type = 'u' order by name
open tabela
fetch next from tabela into @tabela
while @@fetch_status = 0
begin
print ''
print 'Verificando tabela '+@tabela
print ''
set @comando5 = 'dbcc checktable ('+@tabela +', repair_allow_data_loss)'
exec (@comando5)
set @comando = 'dbcc dbreindex ('+@tabela+')'
exec (@comando5)
set @comando5= 'dbcc checkconstraints ('+@tabela+')'
exec (@comando5)
fetch next from tabela into @tabela
end
close tabela
deallocate tabela
exec sp_dboption @datab, 'single', 'false'
declare @tab_nome varchar(255)
declare @tab_statistic varchar(255)
declare @sql_str varchar(255)
declare @db_nome varchar(255)
select @db_nome=name from master..sysdatabases where dbid=(select dbid from master..sysprocesses where spid=@@spid)
checkpoint
declare cur cursor for
select object_name(id),name from sysindexes where name like '_wa_sys%'
set nocount on
open cur
fetch next from cur into @tab_nome,@tab_statistic
while(@@fetch_status=0)
begin
set @sql_str='drop statistics ' + @tab_nome + '.' + @tab_statistic
exec (@sql_str)
fetch next from cur into @tab_nome,@tab_statistic
end
close cur
deallocate cur
exec sp_updatestats
print '*******************************************************************************************'
print 'FINAL DA MANUNTENCAO'
print '*******************************************************************************************'
end
else
begin
print '****** A T E N Ç Â O *******'
print 'A BASE ESTÁ SENDO USADA. ESTE SCRIPT SÓ PODE SER EXECUTADO EM MONOUSUÁRIO !!!'
print '***********************************************************************************************************************'
print 'Seguintes estações/número de conexões estão acessado a base de dados:'
declare @tab varchar(20)
declare @num varchar(2)
declare tabs cursor for select hostname,count(*) from master.dbo.sysprocesses where dbid in ( select dbid from master.dbo.sysdatabases where name = @datab ) group by hostname
open tabs
fetch next from tabs into @tab,@num
while(@@fetch_status=0)
begin
print @tab +'/'+@num
fetch next from tabs into @tab,@num
end
close tabs
deallocate tabs
end
SQL / RM - Base Vazia
Prezados,
Quando se for no cliente para criar uma base vazia, ou fazer manutenção no SGDB (Sistema Gerenciador de Banco de Dados) SQL 7.0 ou SQL 2000, não podemos esquecer que analisar e conferir todos os parâmetros de configuração.
Para criação de uma base de dados ou correção da mesma, sugerimos que realizem a seguinte conferência na base de dados do Corpore:
Verifique nas propriedades do banco de dados, na guia Data Files e Transaction Log se está parametrizado para crescer a base automaticamente sem limitação de tamanho;
Na guia options...
SQL 7.0 - Marcar somente as opções Ansi Null Default, Truncate log on checkpoint, Auto Close e Auto Shirink;
SQL 2000 - No Recovery/Model colocar como Simple (somente se não realiza backup de log); e marcar somente as opções Ansi Null Default, Auto Close e Auto Shrink;
Confira se existe espaço suficiente para o crescimento da base no drive em que a mesma está localizada;
Quando se for no cliente para criar uma base vazia, ou fazer manutenção no SGDB (Sistema Gerenciador de Banco de Dados) SQL 7.0 ou SQL 2000, não podemos esquecer que analisar e conferir todos os parâmetros de configuração.
Para criação de uma base de dados ou correção da mesma, sugerimos que realizem a seguinte conferência na base de dados do Corpore:
Verifique nas propriedades do banco de dados, na guia Data Files e Transaction Log se está parametrizado para crescer a base automaticamente sem limitação de tamanho;
Na guia options...
SQL 7.0 - Marcar somente as opções Ansi Null Default, Truncate log on checkpoint, Auto Close e Auto Shirink;
SQL 2000 - No Recovery/Model colocar como Simple (somente se não realiza backup de log); e marcar somente as opções Ansi Null Default, Auto Close e Auto Shrink;
Confira se existe espaço suficiente para o crescimento da base no drive em que a mesma está localizada;
SQL \ RM - Criptograma
Pessoal,
Conforme solicitado várias vezes a RM Sistemas, alguns clientes solicitam que informações importantes, tais como: valores e datas sejam mascaradas, ou seja, anuladas. O principal intuito é a preservação e sigilo de informações cadastradas na base de dados. Sendo assim, criamos o procedimento abaixo que fará todo o processo, sendo que haverá necessidade apenas de pré-determinar quais tabelas e quais informações deverão ser anuladas.
veja exemplo abaixo:
Dentro do cursor criado na estrutura da procedure, filtrei as seguintes informações a serem anuladas:
P% => Limitei apenas nas tabelas que começam com a letra P, neste caso tabelas do RM-Labore
SALA% => Cujo campos começam com SALA ou
VALOR% => cujo campos começam com VALOR ou
DATA% => cujo campos começam com DATA
Obs.: Dentro deste cursor o usuário poderá definir vários filtros de acordo com a necessidade.
DECLARE @TABELA VARCHAR(20)
DECLARE @CAMPO VARCHAR(20)
DECLARE @COMANDO VARCHAR(255)
DECLARE INFO CURSOR FOR
SELECT T.NAME,C.NAME FROM SYSOBJECTS T, SYSCOLUMNS C
WHERE T.ID=C.ID AND T.NAME LIKE 'P%' AND (C.NAME LIKE 'SALA%' OR C.NAME LIKE 'VALOR%'OR C.NAME LIKE 'DATA%')
OPEN INFO
FETCH NEXT FROM INFO INTO @TABELA,@CAMPO
WHILE @@FETCH_STATUS = 0
BEGIN
SET @COMANDO = 'UPDATE ' + @TABELA + ' SET ' + ''+@CAMPO+'' + ' = NULL '
EXEC ( @COMANDO)
PRINT 'O campo '+@campo+' da tabela '+@tabela +' foi anulado.'
FETCH NEXT FROM INFO INTO @TABELA,@CAMPO
END
CLOSE INFO
DEALLOCATE INFO
Conforme solicitado várias vezes a RM Sistemas, alguns clientes solicitam que informações importantes, tais como: valores e datas sejam mascaradas, ou seja, anuladas. O principal intuito é a preservação e sigilo de informações cadastradas na base de dados. Sendo assim, criamos o procedimento abaixo que fará todo o processo, sendo que haverá necessidade apenas de pré-determinar quais tabelas e quais informações deverão ser anuladas.
veja exemplo abaixo:
Dentro do cursor criado na estrutura da procedure, filtrei as seguintes informações a serem anuladas:
P% => Limitei apenas nas tabelas que começam com a letra P, neste caso tabelas do RM-Labore
SALA% => Cujo campos começam com SALA ou
VALOR% => cujo campos começam com VALOR ou
DATA% => cujo campos começam com DATA
Obs.: Dentro deste cursor o usuário poderá definir vários filtros de acordo com a necessidade.
DECLARE @TABELA VARCHAR(20)
DECLARE @CAMPO VARCHAR(20)
DECLARE @COMANDO VARCHAR(255)
DECLARE INFO CURSOR FOR
SELECT T.NAME,C.NAME FROM SYSOBJECTS T, SYSCOLUMNS C
WHERE T.ID=C.ID AND T.NAME LIKE 'P%' AND (C.NAME LIKE 'SALA%' OR C.NAME LIKE 'VALOR%'OR C.NAME LIKE 'DATA%')
OPEN INFO
FETCH NEXT FROM INFO INTO @TABELA,@CAMPO
WHILE @@FETCH_STATUS = 0
BEGIN
SET @COMANDO = 'UPDATE ' + @TABELA + ' SET ' + ''+@CAMPO+'' + ' = NULL '
EXEC ( @COMANDO)
PRINT 'O campo '+@campo+' da tabela '+@tabela +' foi anulado.'
FETCH NEXT FROM INFO INTO @TABELA,@CAMPO
END
CLOSE INFO
DEALLOCATE INFO
SQL - RM Chronus (Exemplo) - Arno
delete from funchor
declare @codcoligada int
declare @chapa varchar(20)
declare @codsituacao varchar(20)
--set @chapa ='0276626'
DECLARE CURSOR_CHAPA CURSOR FOR
SELECT CODCOLIGADA,CHAPA,CODSITUACAO FROM PFUNC WHERE CODSITUACAO IN ('T','P','E','M','F','I')
and chapa ='0461376' --('0263186','0266619)
OPEN CURSOR_CHAPA
FETCH NEXT FROM CURSOR_CHAPA INTO @CODCOLIGADA,@CHAPA,@CODSITUACAO
WHILE (@@FETCH_STATUS<>-1)
BEGIN
delete from calendario
declare @codhorario varchar(10)
declare @chapa2 varchar(20)
declare @contador int
declare @nrodiashor int
declare @indiniciohorcont int
declare @inicioindice int
declare cursor_dias cursor for
SELECT B.CODCOLIGADA,B.CHAPA,B.CODHORARIO,B.INDINICIOHOR,DATEDIFF(DD,d.iniciopermes,GETDATE())
FROM PFUNC B,AHORARIO C,aparam d
WHERE B.codcoligada=@CODCOLIGADA and B.CHAPA=@CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
and b.codcoligada=d.codcoligada
open cursor_dias
fetch next from cursor_dias into @codcoligada,@chapa2,@codhorario,@inicioindice,@nrodiashor
set @contador=@nrodiashor
select @indiniciohorcont=@inicioindice
while @contador<>-1
begin
--drop table calendario
--create table calendario (codcoligada int,chapa varchar(20),data datetime,codhorario varchar(10),indice int,semana varchar(10), constraint pkcalendario primary key (codcoligada,data,codhorario,indice,semana))
insert into calendario
select @codcoligada,@chapa2,
convert(datetime,convert(varchar,datepart(yyyy,getdate()))+'/'+
convert(varchar,datepart(mm,getdate()))+'/'+
convert(varchar,datepart(dd,getdate())))-@contador,@codhorario,@indiniciohorcont,
datename(dw,getdate()-@contador)
/*contadores*/
if @indiniciohorcont>=(SELECT MAX(INDICE) FROM ABATHOR WHERE CODHORARIO=@CODHORARIO)
begin
select @indiniciohorcont=(select distinct min(indice)
from abathor where codhorario=@codhorario)
end
else select @indiniciohorcont=@indiniciohorcont+1
select @contador=@contador-1
fetch next from cursor_dias into @codcoligada,@chapa2,@codhorario,@inicioindice,@nrodiashor
end
deallocate cursor_dias
IF @CODSITUACAO = 'F'
BEGIN
delete from func
declare @codcoligada2 int
declare @codhorario2 varchar(10)
declare @chapa3 varchar(20)
declare @contador2 int
declare @nrodiasaft1 int
declare @dtinicio1 datetime
declare cursor_comparacao1 cursor for
SELECT A.CODCOLIGADA,A.CHAPA,B.CODHORARIO,case
when dtfIMGOZO IS null
then datediff(dd,DTINIGOZO,getdate())
else datediff(dd,dtiniGOZO,dtfiMGOZO)
end ,dtiniGOZO
FROM PFHSTFER A,PFUNC B,AHORARIO C
WHERE A.codcoligada=@codcoligada and A.CHAPA=@chapa
AND A.CODCOLIGADA=B.CODCOLIGADA
AND A.CHAPA=B.CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
AND A.DTINIGOZO=(SELECT MAX(DTINIGOZO) FROM PFHSTFER WHERE codcoligada=@codcoligada AND CHAPA=@chapa)
open cursor_comparacao1
fetch next from cursor_comparacao1 into @codcoligada2,@chapa3,@codhorario2,@nrodiasaft1,@dtinicio1
set @contador2=@nrodiasaft1
while @contador2<>-1
begin
--drop table func
--create table func (codcoligada int,chapa varchar(20),codhorario varchar(10),data datetime, constraint pkfunc primary key (codcoligada,chapa,codhorario,data))
--delete from func
insert into func
select @codcoligada2,@chapa3,@codhorario2,@dtinicio1+@contador2
select @contador2=@contador2-1
fetch next from cursor_comparacao1 into @codcoligada2,@chapa3,@codhorario2,@nrodiasaft1,@dtinicio1
end
deallocate cursor_comparacao1
--drop table funchor
--CREATE TABLE FUNCHOR (CHAPA VARCHAR(20),CODHORARIO VARCHAR(10),DATA DATETIME, INDICE INT,SEMANA VARCHAR(10),BASE INT)
INSERT INTO FUNCHOR
select a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
from func a,calendario b,abathor c,
(select codcoligada,chapa,base from aafhtfun
where data = (select max(data) from aafhtfun where codcoligada=@codcoligada and chapa=@chapa)
and codcoligada=@codcoligada and chapa=@chapa)d
where a.codcoligada=@codcoligada
and a.codcoligada=b.codcoligada
and a.chapa=b.chapa
and a.codhorario=b.codhorario
and a.data=b.data
and c.codcoligada=b.codcoligada
and c.codhorario=b.codhorario
and c.indice=b.indice
and a.codcoligada=d.codcoligada
and a.chapa=d.chapa
and c.tipo in (0)
and b.semana <> 'Sunday'
and b.data not in (select gferiado.diaferiado from gferiado)
and b.data not in
(select data from aafhtfun,aparam where
aafhtfun.codcoligada=@codcoligada and aafhtfun.chapa=@chapa
and data between iniciopermes and getdate())
group by a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
order by a.data
END
ELSE
if @codsituacao in ('T','P','E','M')
/*SEGUNDA PARTE - COMPARACAO*/
begin
delete from func
declare @codcoligada1 int
declare @codhorario1 varchar(10)
declare @chapa1 varchar(20)
declare @contador1 int
declare @nrodiasaft int
declare @dtinicio datetime
declare cursor_comparacao cursor for
SELECT A.CODCOLIGADA,A.CHAPA,B.CODHORARIO,case
when dtfinal IS null
then datediff(dd,DTINICIO,getdate())
else datediff(dd,dtinicio,dtfinal)
end ,dtinicio
FROM PFHSTAFT A,PFUNC B,AHORARIO C
WHERE A.codcoligada=@CODCOLIGADA and A.CHAPA=@CHAPA
AND A.CODCOLIGADA=B.CODCOLIGADA
AND A.CHAPA=B.CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
AND A.DTINICIO=(SELECT MAX(DTINICIO) FROM PFHSTAFT WHERE CODCOLIGADA=@CODCOLIGADA AND CHAPA=@CHAPA)
open cursor_comparacao
fetch next from cursor_comparacao into @codcoligada1,@chapa1,@codhorario1,@nrodiasaft,@dtinicio
set @contador1=@nrodiasaft
while @contador1<>-1
begin
--drop table func
--create table func (codcoligada int,chapa varchar(20),codhorario varchar(10),data datetime, constraint pkfunc primary key (codcoligada,chapa,codhorario,data))
insert into func
select @codcoligada1,@chapa1,@codhorario1,@dtinicio+@contador1
select @contador1=@contador1-1
fetch next from cursor_comparacao into @codcoligada1,@chapa1,@codhorario1,@nrodiasaft,@dtinicio
end
deallocate cursor_comparacao
--drop table funchor
--CREATE TABLE FUNCHOR (CHAPA VARCHAR(20),CODHORARIO VARCHAR(10),DATA DATETIME, INDICE INT,SEMANA VARCHAR(10),BASE INT)
INSERT INTO FUNCHOR
select a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
from func a,calendario b,abathor c,
(select codcoligada,chapa,base from aafhtfun
where data = (select max(data) from aafhtfun where codcoligada=@codcoligada and chapa=@chapa)
and codcoligada=@codcoligada and chapa=@chapa)d
where a.codcoligada=@codcoligada
and a.codcoligada=b.codcoligada
and a.chapa=b.chapa
and a.codhorario=b.codhorario
and a.data=b.data
and c.codcoligada=b.codcoligada
and c.codhorario=b.codhorario
and c.indice=b.indice
and a.codcoligada=d.codcoligada
and a.chapa=d.chapa
and c.tipo in (0)--(c.tipo<>1 and c.tipo<>3)-- and c.tipo<>4)
and b.semana <> 'Sunday'
and b.data not in (select gferiado.diaferiado from gferiado)
group by a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
order by a.data
end
FETCH NEXT FROM CURSOR_CHAPA INTO @CODCOLIGADA,@CHAPA,@CODSITUACAO
END
DEALLOCATE CURSOR_CHAPA
/*select * from gferiado where diaferiado='2003-07-04'
select * from abathor where codhorario='20'*/
/*select *
from FUNCHOR where data between '2003-06-16' and '2003-07-15' order by chapa , data
*/
/*
select * from abatfunam WHERE CHAPA = '0334078'
select a.codcoligada,a.chapa from pfunc a where exists
(select 1 from aafhtfun b where a.codcoligada=b.codcoligada and a.chapa=b.chapa)
and codsituacao = 'P'
select * from gferiado
order by diaferiado
select * from abathor where CODHORARIO='30' order by INDICE
*/
declare @codcoligada int
declare @chapa varchar(20)
declare @codsituacao varchar(20)
--set @chapa ='0276626'
DECLARE CURSOR_CHAPA CURSOR FOR
SELECT CODCOLIGADA,CHAPA,CODSITUACAO FROM PFUNC WHERE CODSITUACAO IN ('T','P','E','M','F','I')
and chapa ='0461376' --('0263186','0266619)
OPEN CURSOR_CHAPA
FETCH NEXT FROM CURSOR_CHAPA INTO @CODCOLIGADA,@CHAPA,@CODSITUACAO
WHILE (@@FETCH_STATUS<>-1)
BEGIN
delete from calendario
declare @codhorario varchar(10)
declare @chapa2 varchar(20)
declare @contador int
declare @nrodiashor int
declare @indiniciohorcont int
declare @inicioindice int
declare cursor_dias cursor for
SELECT B.CODCOLIGADA,B.CHAPA,B.CODHORARIO,B.INDINICIOHOR,DATEDIFF(DD,d.iniciopermes,GETDATE())
FROM PFUNC B,AHORARIO C,aparam d
WHERE B.codcoligada=@CODCOLIGADA and B.CHAPA=@CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
and b.codcoligada=d.codcoligada
open cursor_dias
fetch next from cursor_dias into @codcoligada,@chapa2,@codhorario,@inicioindice,@nrodiashor
set @contador=@nrodiashor
select @indiniciohorcont=@inicioindice
while @contador<>-1
begin
--drop table calendario
--create table calendario (codcoligada int,chapa varchar(20),data datetime,codhorario varchar(10),indice int,semana varchar(10), constraint pkcalendario primary key (codcoligada,data,codhorario,indice,semana))
insert into calendario
select @codcoligada,@chapa2,
convert(datetime,convert(varchar,datepart(yyyy,getdate()))+'/'+
convert(varchar,datepart(mm,getdate()))+'/'+
convert(varchar,datepart(dd,getdate())))-@contador,@codhorario,@indiniciohorcont,
datename(dw,getdate()-@contador)
/*contadores*/
if @indiniciohorcont>=(SELECT MAX(INDICE) FROM ABATHOR WHERE CODHORARIO=@CODHORARIO)
begin
select @indiniciohorcont=(select distinct min(indice)
from abathor where codhorario=@codhorario)
end
else select @indiniciohorcont=@indiniciohorcont+1
select @contador=@contador-1
fetch next from cursor_dias into @codcoligada,@chapa2,@codhorario,@inicioindice,@nrodiashor
end
deallocate cursor_dias
IF @CODSITUACAO = 'F'
BEGIN
delete from func
declare @codcoligada2 int
declare @codhorario2 varchar(10)
declare @chapa3 varchar(20)
declare @contador2 int
declare @nrodiasaft1 int
declare @dtinicio1 datetime
declare cursor_comparacao1 cursor for
SELECT A.CODCOLIGADA,A.CHAPA,B.CODHORARIO,case
when dtfIMGOZO IS null
then datediff(dd,DTINIGOZO,getdate())
else datediff(dd,dtiniGOZO,dtfiMGOZO)
end ,dtiniGOZO
FROM PFHSTFER A,PFUNC B,AHORARIO C
WHERE A.codcoligada=@codcoligada and A.CHAPA=@chapa
AND A.CODCOLIGADA=B.CODCOLIGADA
AND A.CHAPA=B.CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
AND A.DTINIGOZO=(SELECT MAX(DTINIGOZO) FROM PFHSTFER WHERE codcoligada=@codcoligada AND CHAPA=@chapa)
open cursor_comparacao1
fetch next from cursor_comparacao1 into @codcoligada2,@chapa3,@codhorario2,@nrodiasaft1,@dtinicio1
set @contador2=@nrodiasaft1
while @contador2<>-1
begin
--drop table func
--create table func (codcoligada int,chapa varchar(20),codhorario varchar(10),data datetime, constraint pkfunc primary key (codcoligada,chapa,codhorario,data))
--delete from func
insert into func
select @codcoligada2,@chapa3,@codhorario2,@dtinicio1+@contador2
select @contador2=@contador2-1
fetch next from cursor_comparacao1 into @codcoligada2,@chapa3,@codhorario2,@nrodiasaft1,@dtinicio1
end
deallocate cursor_comparacao1
--drop table funchor
--CREATE TABLE FUNCHOR (CHAPA VARCHAR(20),CODHORARIO VARCHAR(10),DATA DATETIME, INDICE INT,SEMANA VARCHAR(10),BASE INT)
INSERT INTO FUNCHOR
select a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
from func a,calendario b,abathor c,
(select codcoligada,chapa,base from aafhtfun
where data = (select max(data) from aafhtfun where codcoligada=@codcoligada and chapa=@chapa)
and codcoligada=@codcoligada and chapa=@chapa)d
where a.codcoligada=@codcoligada
and a.codcoligada=b.codcoligada
and a.chapa=b.chapa
and a.codhorario=b.codhorario
and a.data=b.data
and c.codcoligada=b.codcoligada
and c.codhorario=b.codhorario
and c.indice=b.indice
and a.codcoligada=d.codcoligada
and a.chapa=d.chapa
and c.tipo in (0)
and b.semana <> 'Sunday'
and b.data not in (select gferiado.diaferiado from gferiado)
and b.data not in
(select data from aafhtfun,aparam where
aafhtfun.codcoligada=@codcoligada and aafhtfun.chapa=@chapa
and data between iniciopermes and getdate())
group by a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
order by a.data
END
ELSE
if @codsituacao in ('T','P','E','M')
/*SEGUNDA PARTE - COMPARACAO*/
begin
delete from func
declare @codcoligada1 int
declare @codhorario1 varchar(10)
declare @chapa1 varchar(20)
declare @contador1 int
declare @nrodiasaft int
declare @dtinicio datetime
declare cursor_comparacao cursor for
SELECT A.CODCOLIGADA,A.CHAPA,B.CODHORARIO,case
when dtfinal IS null
then datediff(dd,DTINICIO,getdate())
else datediff(dd,dtinicio,dtfinal)
end ,dtinicio
FROM PFHSTAFT A,PFUNC B,AHORARIO C
WHERE A.codcoligada=@CODCOLIGADA and A.CHAPA=@CHAPA
AND A.CODCOLIGADA=B.CODCOLIGADA
AND A.CHAPA=B.CHAPA
AND B.CODCOLIGADA=C.CODCOLIGADA
AND B.CODHORARIO=C.CODIGO
AND A.DTINICIO=(SELECT MAX(DTINICIO) FROM PFHSTAFT WHERE CODCOLIGADA=@CODCOLIGADA AND CHAPA=@CHAPA)
open cursor_comparacao
fetch next from cursor_comparacao into @codcoligada1,@chapa1,@codhorario1,@nrodiasaft,@dtinicio
set @contador1=@nrodiasaft
while @contador1<>-1
begin
--drop table func
--create table func (codcoligada int,chapa varchar(20),codhorario varchar(10),data datetime, constraint pkfunc primary key (codcoligada,chapa,codhorario,data))
insert into func
select @codcoligada1,@chapa1,@codhorario1,@dtinicio+@contador1
select @contador1=@contador1-1
fetch next from cursor_comparacao into @codcoligada1,@chapa1,@codhorario1,@nrodiasaft,@dtinicio
end
deallocate cursor_comparacao
--drop table funchor
--CREATE TABLE FUNCHOR (CHAPA VARCHAR(20),CODHORARIO VARCHAR(10),DATA DATETIME, INDICE INT,SEMANA VARCHAR(10),BASE INT)
INSERT INTO FUNCHOR
select a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
from func a,calendario b,abathor c,
(select codcoligada,chapa,base from aafhtfun
where data = (select max(data) from aafhtfun where codcoligada=@codcoligada and chapa=@chapa)
and codcoligada=@codcoligada and chapa=@chapa)d
where a.codcoligada=@codcoligada
and a.codcoligada=b.codcoligada
and a.chapa=b.chapa
and a.codhorario=b.codhorario
and a.data=b.data
and c.codcoligada=b.codcoligada
and c.codhorario=b.codhorario
and c.indice=b.indice
and a.codcoligada=d.codcoligada
and a.chapa=d.chapa
and c.tipo in (0)--(c.tipo<>1 and c.tipo<>3)-- and c.tipo<>4)
and b.semana <> 'Sunday'
and b.data not in (select gferiado.diaferiado from gferiado)
group by a.chapa,b.codhorario,a.data,b.indice,b.semana,d.base
order by a.data
end
FETCH NEXT FROM CURSOR_CHAPA INTO @CODCOLIGADA,@CHAPA,@CODSITUACAO
END
DEALLOCATE CURSOR_CHAPA
/*select * from gferiado where diaferiado='2003-07-04'
select * from abathor where codhorario='20'*/
/*select *
from FUNCHOR where data between '2003-06-16' and '2003-07-15' order by chapa , data
*/
/*
select * from abatfunam WHERE CHAPA = '0334078'
select a.codcoligada,a.chapa from pfunc a where exists
(select 1 from aafhtfun b where a.codcoligada=b.codcoligada and a.chapa=b.chapa)
and codsituacao = 'P'
select * from gferiado
order by diaferiado
select * from abathor where CODHORARIO='30' order by INDICE
*/
Oracle - Dicas para Criação / Manutenção de uma instância Oracle
Dicas para Criação / Manutenção de uma instância Oracle
(RM Sistemas)
O presente documento contém algumas
dicas para DBAs manterem suas instâncias Oracle em perfeito estado de
funcionamento.
As primeiras dicas referem-se a
parâmetros encontrados no arquivo init.ora, encontrado no diretório de
instalação da instância Oracle na máquina em questão.
Para alterar alguns deles (quando
possível), basta editar o arquivo em questão, salvá-lo e restartar a instância.
Quaisquer dúvidas podem ser
encaminhadas ao suporte da RM Sistemas através do mail (suporte@rm.com.br).
Tamanho do bloco Oracle
Este parâmetro deve ser configurado no momento
da criação da base de dados. Sugerimos a utilização de blocos de 8k
(DB_BLOCK_SIZE = 8192).
OBS: Note que o tamanho do bloco deve ser
informado em nº de bytes.
Caso a instância já esteja criada, pode-se
verificar a configuração deste parâmetro, editando-se o arquivo de parâmetros (init.ora) do Oracle e verificando o valor da variável DB_BLOCK_SIZE.
Uma outra alternativa para visualizar o valor
do parâmetro seria a utilização da ferramenta Instance Manager. Aqui, o
parâmetro pode ser visualizado através de:
Initialization
Parameters / Instance Specific
A alteração deste parâmetro só pode ser feita
caso a instância seja recriada.
Distribuição da memória disponível para o Oracle
Depois de determinada a quantidade de memória
que estará disponível para o Sistema Operacional e a quantidade que ficará
disponível para o Oracle, deve-se fazer a distribuição da memória disponível
para o Oracle.
o
SORT_AREA_SIZE
Deve-se configurar este parâmetro com grande
cautela, uma vez que ele reflete a quantidade de memória que cada conexão de usuário irá ter
disponível para operações de SORT.
Devemos levar em consideração também a
quantidade de memória fixa que cada conexão de usuário gasta (1,7 MB).
Sendo assim, o gasto de memória com conexões de
usuários em uma aplicação onde estejam abertas 10 sessões e o SORT_AREA_SIZE
esteja configurado com o valor de 1048576
(1MB) é:
10
* (1,7+1) = 27 MB.
OBS: Note que o valor do SORT_AREA_SIZE deve ser informado em nº de bytes.
O valor a ser configurado para este parâmetro
deve ser definido levando-se em consideração
o número de conexões simultâneas
no Oracle e a quantidade de memória disponínel para mesmo.
o
DB_BLOCK_BUFFER
Este parâmetro irá refletir a quantidade de
memória destinada ao Oracle que será utilizada para Cache de dados.
Este parâmetro deve ser configurado com o
número de blocos do Oracle que será utilizado para este Cache.
Sugerido:
60% da memória restante destinada ao Oracle destinada ao Cache de dados.
Como calcular o valor do parâmetro:
DB_BLOCK_BUFFER =
(M * 1048576) / B
Onde: M
= É a quantidade de memória ( em Mega bytes ) que deve ser destinada ao Buffer de Dados.
B= Tamanho do bloco de dados (em bytes)
utilizado pelo Oracle.
o
SHARED POOL
Este parâmetro irá refletir a quantidade de
memória destinada ao Oracle que será utilizada para o SHARED POOL.
Sugerido:
Restante da memória destinada ao Oracle (40%), destinada ao SHARED POOL.
O valor deste parâmetro deve ser determinado de
Bytes.
SHARED_POOL_SIZE = M
Onde: M=
Memória destinada ao SHARED POOL em bytes.
Tablespaces
Deve-se criar pelo menos uma TableSpace
distinta para cada finalidade: System, Dados,
Indices, Temp, Rollback, Redo.
É desejável também que os DataFiles destas
TableSpaces sejam distribuídos em discos diferentes, de forma a minimizar a
concorrência de acesso. Isto deve ser feito conforme a disponibilidade de
discos. Exemplo:
Cenário
1:
Um
disco:
System, Dados,
Iindices, Temp, Rollback , Redo no mesmo disco, mas em TableSpaces
diferentes.
Cenário
2:
Dois
discos:
1º
disco: Dados + Temp + Rollback
2º disco: System + Indices + Redo
CPU
Deve-se verificar costantemente a taxa de
utilização da CPU, a mesma não deve estar com taxa de utilização muito alta
durante a maior parte do período (90% de utilização).
Caso esteja utilizando mais de um processador
deve-se verificar se a carga da CPU está balanceada.
Para estas medições, pode se
utilizar a ferramenta Performance Monitor (no caso de servidores Windows
NT/2000).
COALESCE
Deve-se verificar periodicamente (mensalmente)
a fragmentação do espaço livre alocado
para cada TableSpace.
o
Pode-se
verificar tal fragmentação utilizando:
SELECT
TABLESPACE_NAME, TOTAL_EXTENTS , PERCENT_EXTENTS_COALESCED
FROM DBA_FREE_SPACE_COALESCED
WHERE PERCENT_EXTENTS_COALESCED <> 100
o
Para
efetuar a desfragmentação:
ALTER TABLESPACE tablespace COALESCE
Atualização de estatísticas
A rotina de atualização de estatísticas deve
ser agendada para execução diária..
Sugere-se o utilizar o Package DBMS_UTILITY
para fazer a atualização de estatísticas:
execute
DBMS_UTILITY.analyze_schema('RM','COMPUTE')
Para agendar a execução diária de estatísticas em um servidor que esteja
utilizando o Windows NT ou Windows 2000:
1º) crie um arquivo TXT com o seguinte
conteúdo:
execute DBMS_UTILITY.analyze_schema('RM','COMPUTE')
2º) Utilize o command prompt para agendar a
tarefa :
at 22:00 every:M,T,W,Th,F,S,Su cmd /c
"sqlplus rm/rm @d:\temp\script.txt"
O comando acima agenda a atualização de
estatíscas para ocorrer todos os dias às 22:00 horas. Considera-se que o
arquivo TXT criado no primeiro item é o d:\temp\script.txt
Indices
Os índices devem ser reconstruídos
periodicamente (mensalmente) , ou após periodo de grande “deleção” dos mesmos.
Para a verificação do percentual de linhas
deletadas em um determinado índice utilize:
1º) Analyze :
ANALYZE
INDEX indice VALIDATE STRUCTURE;
2º) Verificando o percetual de deleção:
SELECT LF_ROWS , DEL_LF_ROWS
FROM INDEX _STATS
OBS: Caso 30% das linhas em folhas
(LF_ROWS) tenham sido deletados (DEL_LF_ROWS), o índice deve ser reconstruído.
3º) Reconstrução do índice:
ALTER INDEX indice REBUILD tablespace.
Para reconstruir o índice, durante o
REBUILD deve haver espaço disponível
para a coexistência dos dois índices (antigo e novo).
O comando abaixo gera um script para a
reconstrução de todos os índices da base de dados:
SELECT 'ALTER INDEX ' || INDEX_NAME ||
' REBUILD TABLESPACE RM_INDICES; '
FROM USER_INDEXES
Este script deve ser executado em um momento em que não haja acesso à
base de dados.
Export / Import
O Export e Import da base de dados deve ser
feito periodicamente com finalidade de reorganizar os dados dentro da base de
dados, desfragmentar e resolver casos de linhas Migradas.
Sugere-se fazer a Exportação / Importação da
base de dados de 2 em 2 meses.
Passos para a execução do Export / Import
§ Export da base.
§ Backup físico da base
§ Drop do Schema
§ Import da base
OBS: Semanalmente sugere-se verificar o número de linhas MIGRADAS na base
de dados. Caso o número esteja muito alto, deve-se fazer o Export / Import da
base.
Para verificar o número de linhas MIGRADAS
utilize:
SELECT
TABLE_NAME, CHAIN_CNT
FROM USER_TABLES
ORDER BY CHAIN_CNT DESC
OBS: A coluna CHAIN_CNT, reflete
não apenas o número de linhas migradas, mas o processo de Export / Import irá
atacar apenas este problema.
ALERT
O ALERT dever ser verificado diariamente .
Deve-se verificar se existem mensagens de erro do tipo ORA-00600 e /ou
ORA-01578 , que indicam erros internos do Oracle ou blocos corrompidos.
Assinar:
Postagens (Atom)
