venerdì 6 settembre 2019

Errore SQL0668N code "7"

Dopo aver fatto un aggiunta di due campi e la cancellazione del primo su una tabella, la tabella stessa è diventata inaccessibile a qualsiasi comando con il messaggio :

SQL0668N  Operation not allowed for reason code "7" on table "DB2.ANAMAGA".

Nello specifico ho effettuato questi comandi
ALTER TABLE ANAMAGA ADD USEOEMCODE VARCHAR(30)
ALTER TABLE ANAMAGA ADD USROEMCODE VARCHAR(30)
ALTER TABLE ANAMAGA DROP COLUMN USEOEMCODE

Per risolvere il problema è bastato effettuare un REORG TABLE sulla tabella stessa ( REORG TABLE DB2.ANAMAGA )

maggiori info al link : https://www.ibm.com/support/pages/how-verify-and-resolve-sql0668n-reason-code-7-when-accessing-table


giovedì 25 luglio 2019

Dimensione tabelle in Sql Server

Ci sono diversi modi per conoscere l'effettiva dimensione in Kb/Mb di una tabella

Usando Sql Server Management Studio è possibile cliccare con il tasto destro sul database, scegliere dal menu la voce Report, quindi la voce "Report Standard" e infine la voce "Spazio su disco utilizzato per tabella".


Sempre con Sql Server Management Studio, selezionare prima la voce "Tabelle" nell'elenco di sinistra. Nella finestra "Dettagli esplora oggetti", una volta visualizzate tutte le tabelle è possibile indicare quali colonne vogliamo visualizzare. Fra le colonne che per default sono deselezionate ci sono : "Spazio utilizzato per i dati (KB)" e "Spazio utilizzato per gli indici (KB)"


L'ultimo modo per determinare lo spazio utilizzato dalle tabelle e degli indici di un database è quello di eseguire la seguente query (thanks Gianni GC Ceccanti 19/03/2021): 

select cast(Tabella as char(50)) as "Tabella", 
       max(Record) as "N. Record",  --max perché in base agli inidici cambia, il max corrisponde al totale sulla tabella
       sum(AllocatoTabellaMB) + sum(AllocatoIndiceMB) as "Totale Allocato (MB)", -- allocato su disco
       sum(AllocatoTabellaMB) as "Allocato Tabella (MB)", -- allocato su disco
       sum(AllocatoIndiceMB) as "Allocato Indice (MB)", -- allocato su disco
       sum(InutilizzatoMB) as "Inutilizzato (MB)" -- differenza tra spazio allocato e spazio utilizzato, quindi disponibile prima che SQLServera allochi nuovo spazio
  FROM (
      SELECT t.name AS "Tabella",
            p.rows as "Record",
            isnull( i.name , '_tabella_' ) as Tipo,
            (case when i.name is null then  CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) else 0 end) AS AllocatoTabellaMB,
            (case when i.name is not null then  CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) else 0 end) AS AllocatoIndiceMB,
            CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS InutilizzatoMB
       FROM sys.tables t
            INNER JOIN sys.indexes i ON t. object_id = i.object_id
            INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
            INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
            LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
      WHERE t.name NOT LIKE 'dt%' 
         AND t.is_ms_shipped = 0
         AND i.OBJECT_ID > 255 
      GROUP BY  t.name, s.name, p.rows, i.name
      ) as innertable
GROUP BY Tabella
ORDER BY sum(AllocatoTabellaMB) + sum(AllocatoIndiceMB) DESC, Tabella
La query precedente, qui sotto, non teneva conto degli indici:
SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name
Riferimenti : 
https://stackoverflow.com/questions/7892334/get-size-of-all-tables-in-database

lunedì 5 febbraio 2018

SQL Server Migration Assistant (SSMA)

SQL Server migration assistant (SSMA) è un tool Microsoft che facilità la migrazione da altri RDBMS verso Sql Server.

SSMA è disponibile per la migrazione dai seguenti RDBMS:
  • Access
  • Db2
  • MySql
  • Oracle
  • SAP ASE

La versione di Sql Server di destinazione dovrà essere una delle seguenti:
  • SQL Server 2008
  • SQL Server 2008 R2
  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016
  • Azure SQL Database
  • SQL Server 2017 on Windows and Linux (Preview)


Il tool premette la migrazione di dati, schema, struttura tabelle, viste, indici e trigger.

Il tool permette di sincronizzare i due database per quanto riguarda gli oggetti presenti. Il mio utilizzo è stato solo quello di migrazione delle strutture delle tabelle, indici e dei dati.

Ho usato il tool per trasferire dai dati da Oracle 10 a Sql Server 2012 Express.
Inizialmente è necessario collegarsi al server Oracle e a quello SQL Server.

Per quanto riguarda Oracle è sufficiente indicare il server e le credenziali.
 Per quanto riguarda Sql Server, oltre a server e credenziali è necessario indicare anche il database di destinazione.



Nella finestra principale il tool visualizza tutti gli schema dell’istanza Oracle.


Per quanto riguarda le strutture dati è necessario eseguire i seguenti passi :
  •          Scegliere lo/gli schema Oracle da migrare
  •          Scegliere la funzione “Convert Schema” dal menu contestuale
  •          Scegliere il database Sql Server di destinazione
  •          Scegliere la funzione “Synchronize with database” dal menu contestuale


Per quanto riguarda i dati è necessario eseguire i seguenti passi :
  •         Scegliere lo/gli schema Oracle da migrare
  •         Scegliere la funzione “Migrate Data” dal menu contestuale


L’utilizzo normale del tool prevede che dato un database di Oracle, tutti i suoi schema vengano passato su un singolo database di Sql Server. Per questo motivo le tabelle di destinazione utilizzano lo stesso schema delle tabelle di origine.

Per cambiare il mapping dello schema è sufficiente selezionare lo schema di origine e cambiare il “target schema” nello “schema mapping” sulla destra dello schermo.
Quindi da database.schema a database.dbo

Nel caso si voglia trasferire ogni schema di Oracle su un database diverso di Sql Server è necessario creare un nuovo progetto di SSMA per ogni schema.

La pagina web di riferimento del tool :