lunedì 21 marzo 2022

Allineamento fra valore Sequence e campo ID della tabella

Scenario :
  • Campo identity autoinc gestito con Trigger e Sequence 
  • Database Oracle versione inferiore alla 12 (perchè dalla 12 è gestito autonomamente come SqlServer)

Nei casi in cui in campo ID ( identificativo univoco ) venga inserito direttamente senza prelevare il campo dalla sequence o per qualche altro motivo ( nel mio caso ripristino delle tabelle e non delle sequence ), è necessario riportare il valore della sequence al massimo valore del campo autoinc +1.

La procedura sotto elencata fa questo lavoro.

DECLARE
  last_used  NUMBER;
  curr_seq   NUMBER;
BEGIN
  SELECT MAX(<CampoAutoInc>) INTO last_used FROM <Tabella>;
  LOOP
    SELECT <Sequence>.NEXTVAL INTO curr_seq FROM dual;
    IF curr_seq >= last_used THEN EXIT;
    END IF;
  END LOOP;
END;

Esempio

DECLARE
  last_used  NUMBER;
  curr_seq   NUMBER;
BEGIN
  SELECT MAX(IDN) INTO last_used FROM TESTAXML ;
  LOOP
    SELECT TESTAXML_SEQ.NEXTVAL INTO curr_seq FROM dual;
    IF curr_seq >= last_used THEN EXIT;
    END IF;
  END LOOP;
END;

lunedì 3 gennaio 2022

Sql Server Collation

Piccola riga sql per scoprire la collation dell'istanza Sql Server e di ogni Database


SELECT ' Istanza' name,CONVERT (varchar(256), SERVERPROPERTY('collation'))
union
Select name,collation_name from sys.databases
order by name  

sabato 1 gennaio 2022

Script per Zip, upload su WeTransfer, mail del log

Ho fatto questo script per automatizzare una serie di funzioni ma soprattutto perchè ho trovato il modo di spedire file a Wetransfer via linea di comando.
Lo script utilizza 3 programmi : 

lo script esegue le seguenti operazioni :
setta delle variabili per la posizione del file di log ( che verrà spedito per mail ), la cartella dove sono presenti i file di backup da spedire, la mail a cui spedire il log delle operazioni
comprime ( con 7Zip ) i file nella cartella di backup, uno per volta
sempre uno per volta li spedisce su wetransfer
spedisce il log delle operazioni alla mail indicata
nel log è indicato il link con cui scaricare i backup
 


set logfilename=c:\dati\log\backup-%date:~6,4%-%date:~3,2%-%date:~0,2%.txt
set backup_path=c:\dati\backup
set mail=a.delguasta+backup@gmail.com
echo "Inizio processo" > %logfilename% 
date /T >> %logfilename%
time /T >> %logfilename%
c:
cd \
cd "C:\Program Files\7-Zip"
echo "-- compressione --" > %logfilename% 
if exist %backup_path%\siglapp.7z del %backup_path%\siglapp.7z
7z.exe a %backup_path%\siglapp.7z %backup_path%\siglapp.bak >> %logfilename%
if exist %backup_path%\ditta1.7z del %backup_path%\ditta1.7z
7z.exe a %backup_path%\ditta1.7z %backup_path%\ditta1.bak >> %logfilename%
cd \dati\script
echo "-- upload --" >> %logfilename% 
wtclient-windows-386.exe upload --no-progress %backup_path%\siglapp.7z >> %logfilename%
wtclient-windows-386.exe upload --no-progress %backup_path%\ditta1.7z >> %logfilename%
echo "-- Invio Mail --" >> %logfilename% 
mailsend1.19.exe -to %mail% -from <from> -starttls -port 587 -auth -smtp smtp.gmail.com -sub test1 -user <from> -pass <password> -cs "utf-8" -mime-type "text/plain" -msg-body  %logfilename%


venerdì 9 luglio 2021

Ricerca Testo all'interno di viste e trigger

Per ricercare una porzione di testo all'interno della definizione di una vista o di un trigger è sufficiente interrogare la tabella sys.syscomments

SELECT * FROM sys.syscomments WHERE text LIKE '%<testo>%'

mercoledì 3 marzo 2021

Funzioni che restituiscono tabelle e join

 
Di seguito una funziona che accetta dei parametri e restituisce, in questo caso, un record di una tabella : 

CREATE FUNCTION dbo.VLISTDATA (@Codice CHAR(5), @Articolo CHAR(30), @Data CHAR(8) )
RETURNS TABLE
AS
RETURN
(
     SELECT * FROM TABRILIS
WHERE CODICE=@Codice
AND ARTICOLO=@Articolo
AND DATAINVALI = (
SELECT MAX(DATAINVALI) DATAINVALI FROM TABRILIS
WHERE CODICE=@Codice
AND ARTICOLO=@Articolo
AND DATAINVALI <= @Data
)
)

L'interessante è però come mettere in JOIN questa funzioni con altre tabelle.

Non è possibile utilizzare una normale JOIN ma è necessario utilizzare una CROSS APPLY come nell'esempio sotto: 

select M.ARTICOLO,M.EPRLORDO,PIPPO.PREZZO
from TESDOCUM T INNER JOIN MOVIMAG M ON T.NUMERO=M.NUMERO
INNER JOIN ANAMAGA A ON M.ARTICOLO=A.CODICE
INNER JOIN CLIFO ON T.CLI_FOR=CLIFO.CODICE
INNER JOIN CFVEN ON T.CLI_FOR=CFVEN.CODCF
Cross apply VLISTDATA(CFVEN.CODLIST,M.ARTICOLO,T.DATAPROTOC) PIPPO

Nell'esempio viene richiamata la funzione VLISTDATA per ogni riga del documento passandogli il codice listino del cliente, il codice articolo e la data del movimento.
La funzione restituisce tutti i campi della tabella TABRILIS con il record corrispondente alla data passata.

NB. L'esempio di cui sopra è solo accademia per Sigla ed è inutile in quanto tale dato si trova già nel campo EPRLISTINO di MOVIMAG

Testato sul Sql Server 2016

link : 
https://dba.stackexchange.com/questions/86143/how-to-join-a-table-with-a-table-valued-function
https://docs.microsoft.com/it-it/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15

mercoledì 20 novembre 2019

Gestire i servizi di una macchina remota

Se c'è la necessità di gestire ( stoppare/ riavviare ) i servizi su una macchina remota, ma non è possibile accedervi remotamente, è possibile usare il metodo di seguito descritto.


  • eseguire Start / Esegui. Scrivere "mmc".
  • File / Add / Remove Snap-in... Cliccare su "Add..."
  • Cercare "Services" e cliccare "Add"
  • selezionare "Another computer:" e inserire il nome / Indirizzo IP della macchina remota. Cliccare su Fine, chiudere ecc.
Sarà possibile a questo punto gestire i servizi come se fossero sulla macchina locale.


link : https://stackoverflow.com/questions/187836/how-do-i-restart-a-service-on-a-remote-machine-in-windows

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