fusac.it /it/maxi-data
  • Facebook
  • Instagram

Procedura pulizia archivi Maximag

edizione Subdued

Illustrerò tutti i passaggi da esegire al fine di non incorrere in errori, è importante seguire l'ordine dei passaggi illustrati in seguito al fine di non icorrere in errori. probabilmente alcuni passaggi possono essere eseguiti in altro ordine senza incrrere in errori ma altri sono propedeutici. mi riservo di approfondire successivamente gli argomenti


Controlli e preparazione del batabase prima di affrontare la procedura di pulizia

Controllo e predisposizione iniziale del batabase

Controllo che nella tabella di configurazione sino presente un campo relativo ad un documento di giacenza inisiale che servirà per riportare il saldo dei documenti che verranno eliminati

TipoDocumentoGiacenzeIniziali

USE [Archivio31]
if isnull((SELECT IsNULL(Configurazione,-1) FROM TabSystemConfig WHERE Parametro='TipoDocumentoGiacenzeIniziali'),-1)<0
BEGIN
RAISERROR ('ERRORE TipoDocumentoGiacenzeIniziali' /* Message text.*/,16/*Severity.*/ , 1 /*State.*/);
END  

Elimino e ricreo le tabelle [BKP_giacenze],[BKP_configurazione],[BKP_IDDocumento] che mi servono per la configurazione della pulizia e riportare i saldi precedenti

BKP_

USE [Archivio31]
GO

DROP TABLE IF EXISTS BKP_giacenze;
DROP TABLE IF EXISTS BKP_configurazione;
DROP TABLE IF EXISTS BKP_IDDocumento;
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[BKP_giacenze](
	[NEW_IDDocumento] [uniqueidentifier] NULL,
	[NEW_IDDocumentocontatore] [uniqueidentifier] NULL,
	[idarticolo] [varchar](20) NULL,
	[quantità] [int] NULL,
	[IDAnagrafica] [varchar](5) NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[BKP_configurazione](
	[Parametro] [varchar](249) NOT NULL,
	[valore] [varchar](249) NOT NULL,
	[Configurazione] [varchar](249) NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[BKP_IDDocumento](
	[IDDocumento] [uniqueidentifier] NOT NULL
) ON [PRIMARY]
GO

Controllo che non siano presenti chiavi duplicate

prima di procedere lancio la seguente query, recupero il risultato e lo eseguo per essere certo che non vi siano chiavi duplicate

ChiaviDuplicate

select 'select ''duplicati in tabella '+ tabella.name+' chiave '+indice.name+''' ''errore'',
'+stuff((select 
 ', ' +col.name
 from sys.tables tb 
 inner join sys.indexes ix on tb.object_id=ix.object_id
 inner join sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id
 inner join sys.columns col on ixc.object_id =col.object_id  and ixc.column_id=col.column_id
 where ix.type>0 and (ix.is_primary_key=1 or ix.is_unique_constraint=1)
 and schema_name(tb.schema_id)='dbo' and tb.name=tabella.name and ix.name=indice.name
 order  by 1 for xml path('')), 1, 1, '')+' , count(*)  from '+tabella.name+' group by '+stuff((select 
 ', ' +col.name
 from sys.tables tb 
 inner join sys.indexes ix on tb.object_id=ix.object_id
 inner join sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id
 inner join sys.columns col on ixc.object_id =col.object_id  and ixc.column_id=col.column_id
 where ix.type>0 and (ix.is_primary_key=1 or ix.is_unique_constraint=1)
 and schema_name(tb.schema_id)='dbo' and tb.name=tabella.name and ix.name=indice.name
 order  by 1 for xml path('')), 1, 1, '')+' having  count(*)>1 '
 from sys.tables tabella 
 inner join sys.indexes indice on tabella.object_id=indice.object_id
 where indice.type>0 and  (indice.is_primary_key=1 or indice.is_unique_constraint=1) 
 and tabella.is_ms_shipped=0 and tabella.name<>'sysdiagrams'
 order by schema_name(tabella.schema_id), tabella.name, indice.name
 

Controllo che siano presenti le stored procedure per la manipolazione di ForeingKey Indici e UNIQUECONSTRAINTS

lancio la seguente query per controllare che siano presenti tutte le stored procedure che serviranno, se mancano le creo

controlloStored

if isnull((SELECT count(*) FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_TYPE = 'PROCEDURE' 
AND ROUTINE_NAME in ( '_Script_CREATE_ALL_FK','_Script_CREATE_ALL_INDEX','_Script_CREATE_ALL_PK_UNIQUECONSTRAINTS','_Script_DROP_ALL_FK','_Script_DROP_ALL_PK_UNIQUECONSTRAINTS','_Script_DROP_ALL_INDEX')),-1)<>6
BEGIN
RAISERROR ('ERRORE mancano le stored procedure' /* Message text.*/,16/*Severity.*/ , 1 /*State.*/);  
END

Elimino e Inserisco le ultime versioni delle stored procedure per la manipolazione di ForeingKey Indici e UNIQUECONSTRAINTS in modo da evitare che ci possano essere errori legati a versioni precedenti

alla fine di ogni gruppo inserisco il nome del file per semplificare il salvataggio
DROP_ALL_Script


IF OBJECT_ID('dbo._Script_CREATE_ALL_FK', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo._Script_CREATE_ALL_FK;
END;
GO
IF OBJECT_ID('dbo._Script_CREATE_ALL_INDEX', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo._Script_CREATE_ALL_INDEX;
END;
GO
IF OBJECT_ID('dbo._Script_CREATE_ALL_PK_UNIQUECONSTRAINTS', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo._Script_CREATE_ALL_PK_UNIQUECONSTRAINTS;
END;
GO
IF OBJECT_ID('dbo._Script_DROP_ALL_FK', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo._Script_DROP_ALL_FK;
END;
GO
IF OBJECT_ID('dbo._Script_DROP_ALL_PK_UNIQUECONSTRAINTS', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo._Script_DROP_ALL_PK_UNIQUECONSTRAINTS;
END;
GO
IF OBJECT_ID('dbo._Script_DROP_ALL_INDEX', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo._Script_DROP_ALL_INDEX;
END;
GO


_Script_DROP_ALL_FK

USE [Archivio31]
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[_Script_DROP_ALL_FK]
AS
BEGIN

declare @ForeignKeyName varchar(4000)
declare @ParentTableName varchar(4000)
declare @ParentTableSchema varchar(4000)
declare @TSQLDropFK varchar(max)

declare CursorFK cursor for 
select fk.name ForeignKeyName, schema_name(t.schema_id) ParentTableSchema, t.name ParentTableName
from sys.foreign_keys fk  inner join sys.tables t on fk.parent_object_id=t.object_id

print 'DECLARE @startdate DATETIME2 = getdate(); '

open CursorFK
fetch next from CursorFK into  @ForeignKeyName, @ParentTableSchema, @ParentTableName
while (@@FETCH_STATUS=0)
begin
 set @TSQLDropFK ='print ''cancellazione foreign key da tabella ' + QUOTENAME(@ParentTableName) + ''';
 ALTER TABLE '+quotename(@ParentTableSchema)+'.'+quotename(@ParentTableName)+' DROP CONSTRAINT '+quotename(@ForeignKeyName)+ char(13) + '
print ''foreign key ' +QUOTENAME(@ForeignKeyName) +' da tabella ' + QUOTENAME(@ParentTableName) + ' cancellata'';
 '
 
 print @TSQLDropFK

fetch next from CursorFK into  @ForeignKeyName, @ParentTableSchema, @ParentTableName
end
close CursorFK
deallocate CursorFK

print ' DECLARE @enddate   DATETIME2 = getdate(); 
 SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
END
GO
_Script_CREATE_ALL_PK_UNIQUECONSTRAINTS

USE [Archivio31]
GO


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[_Script_CREATE_ALL_PK_UNIQUECONSTRAINTS]
AS
BEGIN

declare @SchemaName varchar(100)
declare @TableName varchar(256)
declare @IndexName varchar(256)
declare @ColumnName varchar(100)
declare @is_unique_constraint varchar(100)
declare @IndexTypeDesc varchar(100)
declare @FileGroupName varchar(100)
declare @is_disabled varchar(100)
declare @IndexOptions varchar(max)
declare @IndexColumnId int
declare @IsDescendingKey int 
declare @IsIncludedColumn int
declare @TSQLScripCreationIndex varchar(max)
declare @TSQLScripDisableIndex varchar(max)
declare @is_primary_key varchar(100)

declare CursorIndex cursor for
 select schema_name(t.schema_id) [schema_name], t.name, ix.name,
 case when ix.is_unique_constraint = 1 then ' UNIQUE ' else '' END 
    ,case when ix.is_primary_key = 1 then ' PRIMARY KEY ' else '' END 
 , ix.type_desc,
  case when ix.is_padded=1 then 'PAD_INDEX = ON, ' else 'PAD_INDEX = OFF, ' end
 + case when ix.allow_page_locks=1 then 'ALLOW_PAGE_LOCKS = ON, ' else 'ALLOW_PAGE_LOCKS = OFF, ' end
 + case when ix.allow_row_locks=1 then  'ALLOW_ROW_LOCKS = ON, ' else 'ALLOW_ROW_LOCKS = OFF, ' end
 + case when INDEXPROPERTY(t.object_id, ix.name, 'IsStatistics') = 1 then 'STATISTICS_NORECOMPUTE = ON, ' else 'STATISTICS_NORECOMPUTE = OFF, ' end
 + case when ix.ignore_dup_key=1 then 'IGNORE_DUP_KEY = ON, ' else 'IGNORE_DUP_KEY = OFF, ' end
 + 'SORT_IN_TEMPDB = OFF, FILLFACTOR =' + CAST((CASE WHEN ix.fill_factor=0 THEN 90 ELSE ix.fill_factor END) AS VARCHAR(3)) AS IndexOptions
 , FILEGROUP_NAME(ix.data_space_id) FileGroupName
 from sys.tables t 
 inner join sys.indexes ix on t.object_id=ix.object_id
 where ix.type>0 and  (ix.is_primary_key=1 or ix.is_unique_constraint=1) 
 and t.is_ms_shipped=0 and t.name<>'sysdiagrams'
 order by schema_name(t.schema_id), t.name, ix.name


print 'DECLARE @startdate DATETIME2 = getdate(); '


open CursorIndex
fetch next from CursorIndex into  @SchemaName, @TableName, @IndexName, @is_unique_constraint, @is_primary_key, @IndexTypeDesc, @IndexOptions, @FileGroupName
while (@@fetch_status=0)
begin
 declare @IndexColumns varchar(max)
 declare @IncludedColumns varchar(max)
 set @IndexColumns=''
 set @IncludedColumns=''
 declare CursorIndexColumn cursor for 
 select col.name, ixc.is_descending_key, ixc.is_included_column
 from sys.tables tb 
 inner join sys.indexes ix on tb.object_id=ix.object_id
 inner join sys.index_columns ixc on ix.object_id=ixc.object_id and ix.index_id= ixc.index_id
 inner join sys.columns col on ixc.object_id =col.object_id  and ixc.column_id=col.column_id
 where ix.type>0 and (ix.is_primary_key=1 or ix.is_unique_constraint=1)
 and schema_name(tb.schema_id)=@SchemaName and tb.name=@TableName and ix.name=@IndexName
 order by ixc.index_column_id
 open CursorIndexColumn 
 fetch next from CursorIndexColumn into  @ColumnName, @IsDescendingKey, @IsIncludedColumn
 while (@@fetch_status=0)
 begin
  if @IsIncludedColumn=0 
    set @IndexColumns=@IndexColumns + @ColumnName  + case when @IsDescendingKey=1  then ' DESC, ' else  ' ASC, ' end
  else 
   set @IncludedColumns=@IncludedColumns  + @ColumnName  +', ' 
     
  fetch next from CursorIndexColumn into @ColumnName, @IsDescendingKey, @IsIncludedColumn
 end
 close CursorIndexColumn
 deallocate CursorIndexColumn
  set @IndexColumns = case when len(@IndexColumns) >0 then substring(@IndexColumns, 1, len(@IndexColumns)-1) else '' end
 --set @IndexColumns = substring(@IndexColumns, 1, len(@IndexColumns)-1)
 set @IncludedColumns = case when len(@IncludedColumns) >0 then substring(@IncludedColumns, 1, len(@IncludedColumns)-1) else '' end


set @TSQLScripCreationIndex =''
set @TSQLScripDisableIndex =''
set  @TSQLScripCreationIndex='print ''creazione pk ' +  QUOTENAME(@IndexName) + @is_unique_constraint + @is_primary_key + +@IndexTypeDesc +  '('+@IndexColumns+') '+' su tabella ' + QUOTENAME(@TableName) + ''';
ALTER TABLE [Archivio31_new].'+  QUOTENAME(@SchemaName) +'.'+ QUOTENAME(@TableName)+ ' ADD CONSTRAINT ' +  QUOTENAME(@IndexName) + @is_unique_constraint + @is_primary_key + +@IndexTypeDesc +  '('+@IndexColumns+') '+ 
 case when len(@IncludedColumns)>0 then CHAR(13) +'INCLUDE (' + @IncludedColumns+ ')' else '' end + CHAR(13)+'WITH (' + @IndexOptions+ ') ON ' + QUOTENAME(@FileGroupName) + ';
print ''chiave pk ' +  QUOTENAME(@IndexName) + @is_unique_constraint + @is_primary_key + +@IndexTypeDesc +  '('+@IndexColumns+') '+' creata su tabella ' + QUOTENAME(@TableName) + '''; 
'  

print @TSQLScripCreationIndex
print @TSQLScripDisableIndex

fetch next from CursorIndex into  @SchemaName, @TableName, @IndexName, @is_unique_constraint, @is_primary_key, @IndexTypeDesc, @IndexOptions, @FileGroupName

end
close CursorIndex
deallocate CursorIndex

print ' DECLARE @enddate   DATETIME2 = getdate(); 
 SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
	PRINT '/* SALVARE COME CREATE_ALL_PK_UNIQUECONSTRAINTS.sql */'; 
END
GO
_Script_CREATE_ALL_INDEX

USE [Archivio31]; 
GO

IF OBJECT_ID('dbo._Script_CREATE_ALL_INDEX', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo._Script_CREATE_ALL_INDEX;
END;
GO

CREATE PROCEDURE dbo._Script_CREATE_ALL_INDEX
as
BEGIN
    DECLARE @SchemaName VARCHAR(100)
    DECLARE @TableName VARCHAR(256)
    DECLARE @IndexName VARCHAR(256)
    DECLARE @is_unique VARCHAR(100)
    DECLARE @IndexTypeDesc VARCHAR(100)
    DECLARE @FileGroupName VARCHAR(100)
    DECLARE @is_disabled VARCHAR(100)
    DECLARE @IndexOptions VARCHAR(MAX)
    DECLARE @IndexColumnId INT
    DECLARE @ColumnName VARCHAR(100)
    DECLARE @IsDescendingKey INT 
    DECLARE @IsIncludedColumn INT
    DECLARE @TSQLScripCreationIndex VARCHAR(MAX)
    DECLARE @TSQLScripDisableIndex VARCHAR(MAX)
    DECLARE @IsColumnstore BIT
    DECLARE @IndexColumns VARCHAR(MAX)
    DECLARE @IncludedColumns VARCHAR(MAX)

	PRINT 'USE [Archivio31_new];'
    PRINT 'DECLARE @startdate DATETIME2 = getdate();'

    DECLARE CursorIndex CURSOR FOR
    SELECT 
        SCHEMA_NAME(t.schema_id) AS [schema_name],
        t.name,
        ix.name,
        CASE WHEN ix.is_unique = 1 THEN 'UNIQUE ' ELSE '' END,
        ix.type_desc,
        CASE WHEN ix.is_padded = 1 THEN 'PAD_INDEX = ON, ' ELSE 'PAD_INDEX = OFF, ' END +
        CASE WHEN ix.allow_page_locks = 1 THEN 'ALLOW_PAGE_LOCKS = ON, ' ELSE 'ALLOW_PAGE_LOCKS = OFF, ' END +
        CASE WHEN ix.allow_row_locks = 1 THEN 'ALLOW_ROW_LOCKS = ON, ' ELSE 'ALLOW_ROW_LOCKS = OFF, ' END +
        CASE WHEN INDEXPROPERTY(t.object_id, ix.name, 'IsStatistics') = 1 THEN 'STATISTICS_NORECOMPUTE = ON, ' ELSE 'STATISTICS_NORECOMPUTE = OFF, ' END +
        CASE WHEN ix.ignore_dup_key = 1 THEN 'IGNORE_DUP_KEY = ON, ' ELSE 'IGNORE_DUP_KEY = OFF, ' END +
        'SORT_IN_TEMPDB = OFF, FILLFACTOR = ' + CAST(ISNULL(NULLIF(ix.fill_factor, 0), 90) AS VARCHAR(3)) AS IndexOptions,
        ix.is_disabled,
        FILEGROUP_NAME(ix.data_space_id) AS FileGroupName
    FROM 
        sys.tables t 
        INNER JOIN sys.indexes ix ON t.object_id = ix.object_id
    WHERE 
        ix.type > 0 
        AND ix.is_primary_key = 0 
        AND ix.is_unique_constraint = 0
        AND t.is_ms_shipped = 0 
        AND t.name <> 'sysdiagrams'
    ORDER BY 
        SCHEMA_NAME(t.schema_id), t.name, ix.name;

    OPEN CursorIndex;
    FETCH NEXT FROM CursorIndex INTO @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions, @is_disabled, @FileGroupName;

    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        SET @IndexColumns = '';
        SET @IncludedColumns = '';
        SET @IsColumnstore = CASE WHEN @IndexTypeDesc IN ('CLUSTERED COLUMNSTORE', 'NONCLUSTERED COLUMNSTORE') THEN 1 ELSE 0 END;

        DECLARE CursorIndexColumn CURSOR FOR 
        SELECT 
            col.name,
            ixc.is_descending_key,
            ixc.is_included_column
        FROM 
            sys.tables tb 
            INNER JOIN sys.indexes ix ON tb.object_id = ix.object_id
            INNER JOIN sys.index_columns ixc ON ix.object_id = ixc.object_id AND ix.index_id = ixc.index_id
            INNER JOIN sys.columns col ON ixc.object_id = col.object_id AND ixc.column_id = col.column_id
        WHERE 
            tb.object_id = OBJECT_ID(QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName))
            AND ix.name = @IndexName
        ORDER BY 
            ixc.index_column_id;

        OPEN CursorIndexColumn;
        FETCH NEXT FROM CursorIndexColumn INTO @ColumnName, @IsDescendingKey, @IsIncludedColumn;

        WHILE (@@FETCH_STATUS = 0)
        BEGIN
            IF @IsColumnstore = 1
            BEGIN
                -- Per COLUMNSTORE: tutti le colonne sono incluse allo stesso modo
                SET @IndexColumns = @IndexColumns + QUOTENAME(@ColumnName) + ', ';
            END
            ELSE
            BEGIN
                -- Logica originale per indici ROWSTORE
                IF @IsIncludedColumn = 0 
                    SET @IndexColumns = @IndexColumns + QUOTENAME(@ColumnName) + CASE WHEN @IsDescendingKey = 1 THEN ' DESC, ' ELSE ' ASC, ' END
                ELSE 
                    SET @IncludedColumns = @IncludedColumns + QUOTENAME(@ColumnName) + ', ';
            END

            FETCH NEXT FROM CursorIndexColumn INTO @ColumnName, @IsDescendingKey, @IsIncludedColumn;
        END

        CLOSE CursorIndexColumn;
        DEALLOCATE CursorIndexColumn;

        -- Pulizia delle colonne
        SET @IndexColumns = CASE WHEN LEN(@IndexColumns) >0 THEN LEFT(@IndexColumns, LEN(@IndexColumns) - 1) ELSE '' END;
        SET @IncludedColumns = CASE WHEN LEN(@IncludedColumns) >0 THEN  LEFT(@IncludedColumns, LEN(@IncludedColumns) - 1) ELSE '' END;
		--SET @IndexColumns = CASE WHEN LEN(@IndexColumns) >0 THEN SUBSTRING(@IndexColumns, 1, LEN(@IndexColumns)-1) ELSE '' END
        --SET @IncludedColumns = CASE WHEN LEN(@IncludedColumns) >0 THEN SUBSTRING(@IncludedColumns, 1, LEN(@IncludedColumns)-1) ELSE '' END

        -- Generazione script CREATE INDEX
        SET @TSQLScripCreationIndex = '';
        SET @TSQLScripDisableIndex = '';

        IF @IsColumnstore = 1
        BEGIN
            -- Gestione COLUMNSTORE
            DECLARE @ColumnList VARCHAR(MAX) = CASE 
                WHEN @IndexTypeDesc = 'CLUSTERED COLUMNSTORE' THEN ''
                ELSE '(' + @IndexColumns + ')' 
            END;

            SET @TSQLScripCreationIndex = 
                'PRINT ''Creazione indice COLUMNSTORE: ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ''';' + CHAR(13) +
                'CREATE ' + 
                CASE @IndexTypeDesc 
                    WHEN 'CLUSTERED COLUMNSTORE' THEN 'CLUSTERED ' 
                    ELSE 'NONCLUSTERED ' 
                END + 'COLUMNSTORE INDEX ' + QUOTENAME(@IndexName) + 
                ' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + 
                @ColumnList + 
                ' ON ' + QUOTENAME(@FileGroupName) + ';' + CHAR(13) +
                'PRINT ''Indice COLUMNSTORE ' + QUOTENAME(@IndexName) + ' creato su ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ''';';
        END
        ELSE
        BEGIN
            -- Logica originale per ROWSTORE
            SET @TSQLScripCreationIndex = 
                'PRINT ''Creazione indice: ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + '(' + @IndexColumns + ')'';' + CHAR(13) + 
                'CREATE ' + @is_unique + @IndexTypeDesc + ' INDEX ' + QUOTENAME(@IndexName) + 
                ' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + '(' + @IndexColumns + ')' + 
                CASE WHEN @IncludedColumns IS NOT NULL AND @IncludedColumns <> '' 
                    THEN CHAR(13) + 'INCLUDE (' + @IncludedColumns + ')' 
                    ELSE '' 
                END + CHAR(13) + 
                'WITH (' + @IndexOptions + ') ON ' + QUOTENAME(@FileGroupName) + ';' + CHAR(13) +
                'PRINT ''Indice ' + QUOTENAME(@IndexName) + ' creato su ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ''';';
        END

        -- Gestione indici disabilitati
        IF @is_disabled = 1 
        BEGIN
            SET @TSQLScripDisableIndex = 
                'ALTER INDEX ' + QUOTENAME(@IndexName) + ' ON ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ' DISABLE;' + CHAR(13) +
                'PRINT ''Indice ' + QUOTENAME(@IndexName) + ' disabilitato'';';
        END

        PRINT @TSQLScripCreationIndex;
        IF @TSQLScripDisableIndex <> '' PRINT @TSQLScripDisableIndex;

        FETCH NEXT FROM CursorIndex INTO @SchemaName, @TableName, @IndexName, @is_unique, @IndexTypeDesc, @IndexOptions, @is_disabled, @FileGroupName;
    END

    CLOSE CursorIndex;
    DEALLOCATE CursorIndex;

    PRINT 'DECLARE @enddate DATETIME2 = getdate();'
    PRINT 'SELECT ''Durata esecuzione: '' + CAST(DATEDIFF(SECOND, @startdate, @enddate) AS VARCHAR) + '' secondi'';';
	PRINT '/* SALVARE COME CREATE_ALL_INDEX.sql */';
END
GO
_Script_CREATE_ALL_FK

USE [Archivio31]
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
	PRINT '/* SALVARE COME CREATE_ALL_FK.sql */';

CREATE PROCEDURE [dbo].[_Script_CREATE_ALL_FK]
AS
BEGIN

declare @ForeignKeyID int
declare @ForeignKeyName varchar(4000)
declare @ParentTableName varchar(4000)
declare @ParentColumn varchar(4000)
declare @ReferencedTable varchar(4000)
declare @ReferencedColumn varchar(4000)
declare @StrParentColumn varchar(max)
declare @StrReferencedColumn varchar(max)
declare @ParentTableSchema varchar(4000)
declare @ReferencedTableSchema varchar(4000)
declare @TSQLCreationFK varchar(max)


declare CursorFK cursor for select object_id
from sys.foreign_keys

print 'DECLARE @startdate DATETIME2 = getdate(); '



open CursorFK
fetch next from CursorFK into @ForeignKeyID
while (@@FETCH_STATUS=0)
begin
 set @StrParentColumn=''
 set @StrReferencedColumn=''
 declare CursorFKDetails cursor for
  select  fk.name ForeignKeyName, schema_name(t1.schema_id) ParentTableSchema,
  object_name(fkc.parent_object_id) ParentTable, c1.name ParentColumn,schema_name(t2.schema_id) ReferencedTableSchema,
   object_name(fkc.referenced_object_id) ReferencedTable,c2.name ReferencedColumn
  from sys.foreign_keys fk 
  inner join sys.foreign_key_columns fkc on fk.object_id=fkc.constraint_object_id
  inner join sys.columns c1 on c1.object_id=fkc.parent_object_id and c1.column_id=fkc.parent_column_id 
  inner join sys.columns c2 on c2.object_id=fkc.referenced_object_id and c2.column_id=fkc.referenced_column_id 
  inner join sys.tables t1 on t1.object_id=fkc.parent_object_id 
  inner join sys.tables t2 on t2.object_id=fkc.referenced_object_id 
  where fk.object_id=@ForeignKeyID
 open CursorFKDetails
 fetch next from CursorFKDetails into  @ForeignKeyName, @ParentTableSchema, @ParentTableName, @ParentColumn, @ReferencedTableSchema, @ReferencedTable, @ReferencedColumn
 while (@@FETCH_STATUS=0)
 begin    
  set @StrParentColumn=@StrParentColumn + ', ' + quotename(@ParentColumn)
  set @StrReferencedColumn=@StrReferencedColumn + ', ' + quotename(@ReferencedColumn)
  
     fetch next from CursorFKDetails into  @ForeignKeyName, @ParentTableSchema, @ParentTableName, @ParentColumn, @ReferencedTableSchema, @ReferencedTable, @ReferencedColumn
 end
 close CursorFKDetails
 deallocate CursorFKDetails

 set @StrParentColumn=substring(@StrParentColumn,2,len(@StrParentColumn)-1)
 set @StrReferencedColumn=substring(@StrReferencedColumn,2,len(@StrReferencedColumn)-1)
 set @TSQLCreationFK='print ''cancellazione foreign key da tabella ' + QUOTENAME(@ParentTableName) + ''';
  ALTER TABLE '+quotename(@ParentTableSchema)+'.'+quotename(@ParentTableName)+' WITH CHECK ADD CONSTRAINT '+quotename(@ForeignKeyName)
 + ' FOREIGN KEY('+ltrim(@StrParentColumn)+') '+ char(13) +'REFERENCES '+quotename(@ReferencedTableSchema)+'.'+quotename(@ReferencedTable)+' ('+ltrim(@StrReferencedColumn)+') ' + char(13)+''
 
 print @TSQLCreationFK

fetch next from CursorFK into @ForeignKeyID 
end
close CursorFK
deallocate CursorFK

print ' DECLARE @enddate   DATETIME2 = getdate(); 
 SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
 	PRINT '/* SALVARE COME CREATE_ALL_FK.sql */';
END
GO
_Script_DROP_ALL_PK_UNIQUECONSTRAINTS

USE [Archivio31]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[_Script_DROP_ALL_PK_UNIQUECONSTRAINTS]
AS
BEGIN

DECLARE @SchemaName VARCHAR(256)
DECLARE @TableName VARCHAR(256)
DECLARE @IndexName VARCHAR(256)
DECLARE @TSQLDropIndex VARCHAR(MAX)

DECLARE CursorIndexes CURSOR FOR
SELECT  schema_name(t.schema_id), t.name,  i.name 
FROM sys.indexes i
INNER JOIN sys.tables t ON t.object_id= i.object_id
WHERE i.type>0 and t.is_ms_shipped=0 and t.name<>'sysdiagrams'
and (is_primary_key=1 or is_unique_constraint=1)

print 'DECLARE @startdate DATETIME2 = getdate(); '

OPEN CursorIndexes
FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName
WHILE @@fetch_status = 0
BEGIN

  SET @TSQLDropIndex = 'print ''cancellazione pk da tabella ' + QUOTENAME(@TableName) + ''';
  IF (OBJECT_ID('''+QUOTENAME(@SchemaName)+ '.' +QUOTENAME(@IndexName)+''', ''PK'') IS NOT NULL)
BEGIN
    ALTER TABLE '+QUOTENAME(@SchemaName)+ '.' + QUOTENAME(@TableName) + ' DROP CONSTRAINT ' +QUOTENAME(@IndexName) +'
END;
print ''chiave ' +QUOTENAME(@IndexName) +' da tabella ' + QUOTENAME(@TableName) + ' cancellata'';
'
  PRINT @TSQLDropIndex
  FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName
END

CLOSE CursorIndexes
DEALLOCATE CursorIndexes

print ' DECLARE @enddate   DATETIME2 = getdate(); 
 SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
	PRINT '/* SALVARE COME DROP_ALL_PK_UNIQUECONSTRAINTS.sql */';
	
END
GO
_Script_DROP_ALL_INDEX

USE [Archivio31]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[_Script_DROP_ALL_INDEX]
AS
BEGIN

DECLARE @SchemaName VARCHAR(256)DECLARE @TableName VARCHAR(256)
DECLARE @IndexName VARCHAR(256)
DECLARE @TSQLDropIndex VARCHAR(MAX)

DECLARE CursorIndexes CURSOR FOR
 SELECT schema_name(t.schema_id), t.name,  i.name 
 FROM sys.indexes i
 INNER JOIN sys.tables t ON t.object_id= i.object_id
 WHERE i.type>0 and t.is_ms_shipped=0 and t.name<>'sysdiagrams'
 and (is_primary_key=0 and is_unique_constraint=0)

print 'DECLARE @startdate DATETIME2 = getdate(); '


OPEN CursorIndexes
FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName

WHILE @@fetch_status = 0
BEGIN
 SET @TSQLDropIndex = 'print ''cancellazione indici da tabella ' + QUOTENAME(@TableName) + ''';
  DROP INDEX '+QUOTENAME(@SchemaName)+ '.' + QUOTENAME(@TableName) + '.' +QUOTENAME(@IndexName) +';
print ''indice ' +QUOTENAME(@IndexName) +' da tabella ' + QUOTENAME(@TableName) + ' cancellato'';
'

 PRINT @TSQLDropIndex
 FETCH NEXT FROM CursorIndexes INTO @SchemaName,@TableName,@IndexName
END

CLOSE CursorIndexes
DEALLOCATE CursorIndexes 

print ' DECLARE @enddate   DATETIME2 = getdate(); 
 SELECT ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar); '
	PRINT '/* SALVARE COME DROP_ALL_INDEX.sql */'; 
END
GO

Preparazione del database di destinazione

su Archivio_origine inserisco i valori del backup

è importante inserire il primo giorno da tenere come data
parametriBKP
/*parametri pulizia */
insert into [Archivio31].[dbo].[BKP_configurazione] (Parametro , valore, Configurazione) values 
('data','20230101',''),
('tabella','ArticoliValori','where isnull(adata,getdate())>=(select valore from  [Archivio_origine].[dbo].[BKP_configurazione] where parametro=''data'')'),
('tabella','ArticoliMovimenti','where iddocumento in (select IDDocumento from  [Archivio_origine].[dbo].[BKP_IDDocumento])'),
('tabella','Audit','where data>=(select valore from  [Archivio_origine].[dbo].[BKP_configurazione] where parametro=''data'')')

Eseguo il backup

Creo una copia di sicurezza del database e per creare una copia di destinazione

  • Eseguo il backup di Archivio31 (origine)
  • Eseguo il restore di Archivio31 su Archivio31_new (destinazione)
  • Rinomino Archivio31 in Archivio_origine in modo da mandare anche offline i servizi

Eseguo le stored per la creazione gli script

lancio le seguenti stored procedure e salvo ordinatamente i risultati cercando di nominare gli script generati con nomi che richiamano allo script generante. perchè serviranno in un secondo momento

SalvataggioScript

exec _Script_CREATE_ALL_FK;
exec _Script_CREATE_ALL_INDEX;
exec _Script_CREATE_ALL_PK_UNIQUECONSTRAINTS;
exec _Script_DROP_ALL_FK;
exec _Script_DROP_ALL_PK_UNIQUECONSTRAINTS;
exec _Script_DROP_ALL_INDEX;

Genero uno script per disabilitare tutti i trigger tramite l'esecuzione del seguente codice

DISABLETRIGGERALL
/*disable TRIGGER all*/
SELECT 
'ALTER TABLE  [Archivio31_new].[dbo].[' +  tab.name+'] DISABLE TRIGGER ALL; '
FROM sysobjects tab 
WHERE 1=1 and tab.xtype = 'U' AND tab.name not like 'BKP_%'

Genero uno script per eliminare tutti i dati presenti all'interno di tutte le tabelle tranne BKP_% tramite l'esecuzione del seguente codice

tronco
/*truncate table all */
SELECT ' truncate table  [Archivio31_new].[dbo].[' +  tab.name+']; ' 'tronco'
FROM sysobjects tab 
WHERE 1=1 and tab.xtype = 'U' AND tab.name not like 'BKP_%'  AND tab.name not like '__PKIX' 
ORDER BY 1

inizio a lavorare per svuotare il database di destinazione

lancio gli script creati in precedenza per preparare il database di destinazione

  • USE [Archivio31_new]
  • disable TRIGGER all
  • DROP_ALL_FK
  • DROP_ALL_PK_UNIQUECONSTRAINTS
  • DROP_ALL_INDEX
  • truncate table all
  • (per sicurezza faccio un BACKUP una volta svuotato tutto)
  • durente il backup del database vuoto posso comunque eseguire tutte le query seguenti fino a Eseguire COPIA_TABELLE_ALL!

Processo di copia

Inizio il processo di copia

Dopo aver completato le procedure per prepararate il processo di pulizia ora siamo arrivati al punto critico. Ora il database è stato messo offline e tutti i processi sono fermi. Da ora i dati presenti sono fermi e veranno migrati esclusivamente i dati storici uguali o successivi alla data di pulizia e quelli delle tabelle operative.

originariamente qui si inserivano i tati relativi alledate da cancellare ma sono stati anticipati subito prima della copia del db in modo da poter avere le date anche sun nuovo database per i futuri controlli

su Archivio_origine inserisco i valori dei filtri per i gruppi tipo SCOUT

SCOUTlike
/*parametri pulizia SCOUT like */
insert into [Archivio_origine].[dbo].[BKP_configurazione] (Parametro , valore, Configurazione)
SELECT 'tabella' as parametro, tab.name AS valore, 
'where data>=(select valore from  [Archivio_origine].[dbo].[BKP_configurazione] where parametro=''data'')' as configurazione
FROM sysobjects tab WHERE 1=1 and tab.xtype = 'U'  AND  tab.name in ('TempBelgiumzeb','TempBellu','TempModa','TempPapavero','TempRetail','TempScout','TempSimon')
ORDER BY tab.name ;

inserisco le giacenze iniziali in tabella BKP_giacenze e la preparo per poi essere reinserite alla fine della copia

BKP_giacenze1
/*inserisco la giacenza */
INSERT INTO [Archivio_origine].[dbo].[BKP_giacenze] (NEW_IDDocumentocontatore,IDArticolo,Quantità,IDAnagrafica)
select newid(), idarticolo,sum(movgiacenza) ,idanagrafica from [Archivio_origine].[dbo].ArticoliMovimenti am 
where datamov<(select valore from  [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data') 
group by idanagrafica,idarticolo having sum(movgiacenza)<>0
BKP_giacenze2
/*intesto un IDdocumento per ogni Anagrafica */ 
use [Archivio_origine]
declare @idanagrafica varchar(20)
DECLARE @conteggio INT
DECLARE @newdocumento uniqueidentifier
SET @conteggio = (select count(*) conteggio from BKP_giacenze  where NEW_IDDocumento is null)
WHILE (@conteggio >=1)
BEGIN
select top 1 @idanagrafica=idanagrafica ,@newdocumento=newid() from BKP_giacenze where NEW_IDDocumento is null  
update BKP_giacenze set NEW_iddocumento=@newdocumento where idanagrafica=@idanagrafica
SET @conteggio = (select count(*) conteggio from BKP_giacenze  where NEW_IDDocumento is null)
END
BKP_giacenze3
/*splitta giacenze smallint */
declare @idanagrafica1 uniqueidentifier
DECLARE @conteggio1 INT
DECLARE @multiplicatore INT
DECLARE @newdocumento1 uniqueidentifier
SET @conteggio1 = (select count(*) conteggio from BKP_giacenze  where  Quantità>32000 or Quantità<-32000)
WHILE (@conteggio1 >=1)
BEGIN
select top 1 @idanagrafica1=NEW_IDDocumentocontatore ,@multiplicatore=(case when quantità>1 then 32000 else -32000 end)  ,@newdocumento1=newid() from BKP_giacenze where  Quantità>32000 or Quantità<-32000  
insert into [Archivio_origine].[dbo].[BKP_giacenze] (NEW_IDDocumento,	NEW_IDDocumentocontatore,	idarticolo,	quantità,	IDAnagrafica)
select NEW_IDDocumento,	newid(),	idarticolo,	quantità-@multiplicatore,	IDAnagrafica from BKP_giacenze where NEW_IDDocumentocontatore=@idanagrafica1
update BKP_giacenze set quantità=@multiplicatore where NEW_IDDocumentocontatore=@idanagrafica1
SET @conteggio1 = (select count(*) conteggio from BKP_giacenze  where  Quantità>32000 or Quantità<-32000)
END

inserisco i documenti da riportare che saranno solo quelli con una data superiore o uguale a quella richiesta

BKP_IDDocumento2
/*inserisco id documenti da salvare */
insert into [Archivio_origine].[dbo].[BKP_IDDocumento] (IDDocumento)
select iddocumento from [Archivio_origine].[dbo].[StoricoDocumentoParametri] 
where iddocumento in ((select iddocumento from [Archivio_origine].[dbo].[storicodocumentoparametri] 
where data>=(select valore from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data' )) 
union (select '00000000-0000-0000-0000-000000000000'))

/*inserisco in configurazione i filtri relativi agli storici*/
insert into [Archivio_origine].[dbo].[BKP_configurazione] (Parametro , valore, Configurazione)
SELECT 'tabella' as parametro, tab.name AS valore, 
' where iddocumento in (select iddocumento from  [Archivio_origine].[dbo].[BKP_IDDocumento])' as configurazione
FROM sysobjects tab WHERE 1=1 and tab.xtype = 'U'  AND tab.name  like 'storicodocumento%' and tab.name<>'StoricoDocumentoPagamenti'
ORDER BY tab.name ;

script per creare la copia delle tabelle

eseguo il seguente codice
CopiaTabelle
/*CopiaTabelle */
print 'DECLARE @orainizio DATETIME2 = getdate();  
DECLARE @startdate DATETIME2;
DECLARE @enddate   DATETIME2;';

(SELECT tab.name AS tabella
,case when tab.name in (select valore from BKP_configurazione where Parametro='tabella') then (select configurazione from BKP_configurazione where valore=tab.name)  else '' end as filtri
,' truncate table  [Archivio31_new].[dbo].[' +  tab.name+'] ' 'tronco',
'set @startdate=getdate();'+
'print ''inizio copia [' +  tab.name+'] ''+convert(varchar ,@startdate,24); '+
'ALTER TABLE  [Archivio31_new].[dbo].[' +  tab.name+'] DISABLE TRIGGER ALL; '+
 case isnull((select top 1  1 from   syscolumns campi WHERE tab.id = campi.id and colstat=1),0) when 1 then 'SET IDENTITY_INSERT [Archivio31_new].[dbo].[' +  tab.name+']  ON;   ' else '' end
+'insert into '+'[Archivio31_new].[dbo].['+tab.name+']  ('   +
(select stuff((SELECT ',['+campi.name+']' FROM syscolumns campi WHERE tab.id = campi.id and campi.iscomputed<>1 order by campi.colorder,1 for xml path('')), 1, 1, ''))
+') select '
+(select stuff((SELECT ',['+campi.name+']' FROM syscolumns campi WHERE tab.id = campi.id and campi.iscomputed<>1 order by campi.colorder,1 for xml path('')), 1, 1, ''))
+ ' from  [Archivio_origine].[dbo].[' +  tab.name+']  '  
+ case when tab.name in (select valore from BKP_configurazione where Parametro='tabella') then (select configurazione from BKP_configurazione where valore=tab.name)  else '' end
+' ;' + case isnull((select top 1  1 from   syscolumns campi WHERE tab.id = campi.id and colstat=1),0) when 1 then 'SET IDENTITY_INSERT [Archivio31_new].[dbo].[' +  tab.name+']  OFF ;   ' else '' end 
+'set @enddate=getdate();'
+'print ''Fine copia [' +  tab.name+']  ''+convert(varchar ,@enddate,24); '
+'print ''esecuzione copia [' +  tab.name+'] durata minuti: ''+ cast(DATEDIFF(minute, @startdate, @enddate) as varchar);'
'copia tab'
,'ALTER TABLE  [Archivio31_new].[dbo].[' +  tab.name+'] ENABLE TRIGGER ALL; ' 'riabilita trigger'
FROM sysobjects tab 
WHERE 1=1 and tab.xtype = 'U' AND tab.name not like 'BKP_%'  AND tab.name not like '__PKIX' )
ORDER BY 1
print '
DECLARE @orafine   DATETIME2 = getdate(); 
print ''esecuzione processo durata minuti: ''+ cast(DATEDIFF(minute, @orainizio, @orafine) as varchar);   
';
salvare la colonna "riabilita trigger" in un file RIABILITA_TRIGGER_ALL.sql per dopo
copiare il risultato della colonna "copia tab" tra le righe qui sotto , salvare in un nuovo file COPIA_TABELLE_ALL.sql
CopiaTab
/*COPIA_TABELLE_ALL */
DECLARE @orainizio DATETIME2 = getdate();  
DECLARE @startdate DATETIME2;
DECLARE @enddate   DATETIME2;

--copia qui "copia tab"

DECLARE @orafine   DATETIME2 = getdate(); 
print 'esecuzione processo durata minuti: '+ cast(DATEDIFF(minute, @orainizio, @orafine) as varchar);

Eseguire COPIA_TABELLE_ALL!


Ripristino e Controllo giacenze iniziali

Eseguo il codice seguente per inserire nel nuovo database dei documenti di giacenza iniziale con le quantità del giorno ultimo eliminato

copiaGiacenzeIniziali
/*copiaGiacenzeIniziali */
DECLARE @orainizio DATETIME2 = getdate();  
DECLARE @startdate DATETIME2;
DECLARE @enddate   DATETIME2;

print 'inizio copia [ArticoliMovimenti] '+convert(varchar ,getdate(),24); ALTER TABLE  [Archivio31_new].[dbo].[ArticoliMovimenti] DISABLE TRIGGER ALL;
insert [Archivio31_new].[dbo].[ArticoliMovimenti] (IDDocumento,IDDocumentoContatore,IDAnagrafica,IDArticolo,Quantità,MovGiacenza,MovLanciato,MovOrdinato,MovEsterno,MovReso,MovAcquistato,MovVenduto,MovImpegnato,MovBloccato,IDAnagraficaMov,IDTipoMov,AbbrTipoMov,NumeroMov,DataMov,DataOraMov,FlagMovLocale,Valore_Prezzo)
select NEW_IDDocumento,NEW_IDDocumentocontatore,IDAnagrafica,IDArticolo,Quantità,Quantità,0,0,0,0,0,0,0,0,'',(select  configurazione from [Archivio_origine].[dbo].[TabSystemConfig] where Parametro='TipoDocumentoGiacenzeIniziali'),'giacIniziale',0
--,convert(varchar,(select dateadd(dd,-1,valore) from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data'),101)
,(select dateadd(dd,-1,valore) from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data')
,(select dateadd(dd,-1,valore) from [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data'),1,0
from [Archivio_origine].[dbo].[BKP_giacenze] ;
print 'Fine copia [ArticoliMovimenti]  '+convert(varchar ,getdate(),24); 

print 'inizio copia [StoricoDocumento] '+convert(varchar ,getdate(),24); ALTER TABLE  [Archivio31_new].[dbo].[StoricoDocumento] DISABLE TRIGGER ALL; 
INSERT INTO [Archivio31_new].[dbo].[StoricoDocumento] (IDDocumento,IDDocumentoContatore,IDArticolo,Quantità,DataArticolo) 
select distinct NEW_IDDocumento,NEW_IDDocumentocontatore,idarticolo,Quantità,(select dateadd(dd,-1,(select valore from  [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data'))) from [Archivio_origine].[dbo].[BKP_giacenze]
print 'Fine copia [StoricoDocumento]  '+convert(varchar ,getdate(),24); 

print 'inizio copia [StoricoDocumentoParametri] '+convert(varchar ,getdate(),24); ALTER TABLE  [Archivio31_new].[dbo].[StoricoDocumentoParametri] DISABLE TRIGGER ALL; 
INSERT INTO [Archivio31_new].[dbo].[StoricoDocumentoParametri] (IDDocumento,IDAnagraficabase,TipoDocumento,GruppoNumerazione,Data,DataCreazione,Numero,IDOperatore,Anno,RAS_Spedito) 
select distinct NEW_IDDocumento ,IDAnagrafica ,(SELECT Configurazione FROM [Archivio_origine].[dbo].TabSystemConfig WHERE Parametro='TipoDocumentoGiacenzeIniziali') ,(SELECT Configurazione FROM [Archivio_origine].[dbo].TabSystemConfig WHERE Parametro='TipoDocumentoGiacenzeIniziali') ,(select dateadd(dd,-1,(select valore from  [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data')) ) data ,GetDate() ,0 ,'ANDREI' ,year((select dateadd(dd,-1,(select valore from  [Archivio_origine].[dbo].[BKP_configurazione] where parametro='data')) )) ,0 
from [Archivio_origine].[dbo].[BKP_giacenze];
print 'Fine copia [StoricoDocumentoParametri]  '+convert(varchar ,getdate(),24); 

DECLARE @orafine   DATETIME2 = getdate(); 
print 'esecuzione processo durata minuti: '+ cast(DATEDIFF(minute, @orainizio, @orafine) as varchar);

eseguo un po di query di controllo per vedere se le giacenze post cancellazione corrispondono a quelle precedenti

ControlloGiacenze
/*ControlloGiacenze*/
select idarticolo ,idanagrafica ,sum(movgiacenza) - (select  sum(movgiacenza)  from [Archivio31_new].[dbo].[ArticoliMovimenti]  am2 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )
from [Archivio_origine].[dbo].[ArticoliMovimenti]  am1
group by idanagrafica,idarticolo having sum(movgiacenza) - (select  sum(movgiacenza)  from [Archivio31_new].[dbo].[ArticoliMovimenti]  am2 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )<>0;

select idarticolo ,idanagrafica ,sum(movgiacenza) - (select  sum(movgiacenza) from [Archivio31_new].[dbo].[ArticoliMovimenti]  am1 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )
from [Archivio_origine].[dbo].[ArticoliMovimenti]  am2 
group by idanagrafica,idarticolo having sum(movgiacenza) - (select  sum(movgiacenza)  from [Archivio31_new].[dbo].[ArticoliMovimenti]  am1 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )<>0;

select idarticolo ,idanagrafica ,sum(movgiacenza) - (select  sum(movgiacenza)  from [Archivio_origine].[dbo].[ArticoliMovimenti]  am2 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )
from [Archivio31_new].[dbo].[ArticoliMovimenti]  am1
group by idanagrafica,idarticolo having sum(movgiacenza) - (select  sum(movgiacenza)  from [Archivio_origine].[dbo].[ArticoliMovimenti]  am2 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )<>0;

select idarticolo ,idanagrafica ,sum(movgiacenza) - (select  sum(movgiacenza) from [Archivio_origine].[dbo].[ArticoliMovimenti]  am1 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )
from [Archivio31_new].[dbo].[ArticoliMovimenti]  am2 
group by idanagrafica,idarticolo having sum(movgiacenza) - (select  sum(movgiacenza)  from [Archivio_origine].[dbo].[ArticoliMovimenti]  am1 where am2.idarticolo=am1.idarticolo and am2.idanagrafica=am1.idanagrafica )<>0;
select idanagrafica, sum(q) from
((
select idanagrafica ,sum(movgiacenza) q
from [Archivio31_new].[dbo].[ArticoliMovimenti]  am2 
group by idanagrafica having sum(movgiacenza) <>0
) union all (
select idanagrafica ,sum(-movgiacenza) q
from [Archivio_origine].[dbo].[ArticoliMovimenti]  am2 
group by idanagrafica having sum(movgiacenza) <>0
)) as pippo
group by idanagrafica

Riattivazione Database destinazione e sostituzione

Recupero gli script salvati in precedenza e li eseguo in ordine

  1. RIABILITA TRIGGER ALL
  2. CREATE_ALL_PK_UNIQUECONSTRAINTS
  3. CREATE_ALL_INDEX
  4. CREATE_ALL_FK

Rinomino i DataBase per rimetterli online

  • rename Archivio_origine -> Archivio31_yymmgg
  • rename Archivio31_new -> Archivio31

ultime pulizie

eseguo la query per controllare quanti e quali valori data precancellazione sono ancora presenti nel database

lancio la seguente query e copio il risultato della colonna New_query come nuova query sostituendo l'union finale con un order by record desc

DateRestanti
/*DateRestanti*/
Select Distinct TABLE_SCHEMA,TABLE_NAME,TABLE_CATALOG,COLUMN_NAME 
,DATA_TYPE
,'(select  '''+TABLE_NAME+''' tabella,  '''+COLUMN_NAME+''' campo, count(*) record , ''delete  '+TABLE_NAME+'  where '+COLUMN_NAME+'<''''20220101'''' '' elimina from '+TABLE_NAME+'  where '+COLUMN_NAME+'<''20220101'') union ' New_query
from INFORMATION_SCHEMA.COLUMNS
Where 1=1 
AND TABLE_NAME not in (select valore from BKP_configurazione where Parametro='tabella')
and TABLE_NAME not like 'TempArticoli_%'
AND NOT TABLE_NAME LIKE 'temp%'
AND NOT TABLE_NAME LIKE '%Files'
AND TABLE_NAME NOT IN ('Anagrafica','StoricoDocumento','StoricoDocumentoParametri','ArticoliLocale','TabStatistiche',
'StoricoDocumentoParametriAgg','RAS_StoricoDocumentoParametri','RAS_StoricoDocumento','TabNazioniExtraSogliaFatturato',
'TabSysMacchine','ImportXlsMagento','AnagraficaVarListini','I24_Anag','TabSysScheduler')
and DATA_TYPE='datetime'
  • pulizia ArticoliValori
  • pulizia Articoli
  • pulizia Modelli, tessuti, colori
  • pulizia soggetti

ultimi controlli

  • Template articoli
  • schede modelli

Fine ci vediamo l'anno prossimo


Menu

  • Homepage
  • Generic
  • Elements
  • Submenu
    • Lorem Dolor
    • Feugiat Veroeros
  • Adipiscing
  • Another Submenu
    • Lorem Dolor2
    • Feugiat Veroeros2
  • Consulenza
  • Domotica
  • Fulvio Sacerdoti
  • maxi-data
  • maximag
  • privato

Ante interdum

Aenean ornare velit lacus, ac varius enim lorem ullamcorper dolore aliquam.

Aenean ornare velit lacus, ac varius enim lorem ullamcorper dolore aliquam.

Aenean ornare velit lacus, ac varius enim lorem ullamcorper dolore aliquam.

  • More

Contatti

Porobabilmente non leggero la mail almeno per il periodo di test del sito ma puoi provare a inviare

  • fusac.it@gmail.com
  • +390683393347
  • viale Etiopia 12 Roma italy

© fusac.it. All rights reserved. Demo Images: Unsplash. Design: HTML5 UP.