02 - Database DB2 for i02a - SQL

Naming SYS vs SQL quante differenze

L’SQL è diventato lo standard del settore per tutti i DB relazionali, sia per la definizione di database sia per l’accesso agli oggetti del database.

il “DB2 for i” è l’unico database integrato direttamente nel sistema operativo e all’epoca aveva già un suo metodo per accedere agli oggetti e assegnare le autorizzazioni con le sue regole applicabili per l’utilizzo degli elenchi di librerie.

Purtroppo queste regole non corrispondevano allo standard SQL, quindi per abilitare sia le convenzioni di denominazione “IBM i” che SQL standard abbiamo due modalità di convenzioni di denominazione *SYS e *SQL.

Come si imposta il tipo di denominazione? Dipende dall’ambiente di lavoro:

Ambiente di lavoro Modalità di impostazione
Interattivo STRSQL Tasto Opzionale F13
SQL Incorporato nei programmi EXEC SQL Set Option Naming = *SQL
Comando RUNSQLSTM RUNSQLSTM SRCFILE (LIB/QSQLDML) SRCMBR(MIO) NAMING (*SQL)
ACS Definito nella connessione
  

La prima macro differenza

Con *SYS possiamo usare “/” o “.” come qualificatore :

Select * from MIALIBRERIA/MIATABELLA

equivale a

Select * from MIALIBRERIA.MIATABELLA

invece con *SQL solo il qualificatore “.”;

Se non si specifica lo schema Select * from MIATABELLA

con *SYS cercherà la tabella nella lista delle librerie mentre con *SQL cercherà la tabella nell schema con lo stesso nome dell’utente.

Differenze fra creazione di libreria, schema o collection

I termini libreria, schema e collection possono essere usati come sinonimi e descrivono un contenitore in cui gli oggetti sono raggruppati.

Il termine libreria proviene dall’area di “AS/400”, il termine “collection” è stato utilizzato per il contenitore in cui sono archiviati gli oggetti del database originariamente da IBM.

Tuttavia, entrambi i termini (libreria e collection) non corrispondono al termine definito nello standard SQL, in cui lo stesso tipo di oggetto viene chiamato schema.

Una libreria può essere creata con il comando CRTLIB o con le istruzioni CREATE COLLECTION (specifici di IBM) o CREATE SCHEMA (standard SQL).

Mentre viene generato solo una libreria vuota quando si utilizza il comando CRTLIB, un certo numero di oggetti viene creato direttamente nello schema quando vengono utilizzate le istruzioni SQL.

Ciò crea un ricevitore di giornale e un giornale in cui vengono automaticamente registrate le tabelle create nello schema, vengono inoltre create viste del catalogo che contengono informazioni sugli oggetti del database presenti nello schema.

Creazione di uno schema o oggetti di database con denominazione del sistema *SYS:

Se una libreria viene creata tramite SQL utilizzando CREATE SCHEMA, CREATE COLLECTION o CRTLIB con convenzioni di denominazione del sistema, il profilo utente o il profilo di gruppo diventa il proprietario dello schema / libreria.

Il proprietario ha tutti i diritti sullo schema creato, il *PUBLIC riceve l’autorizzazione memorizzata nel valore di sistema QCRTAUT (default *CHANGE).

La stessa regola vale per tutti gli altri oggetti di database creati con *sys.

Creazione di uno schema con denominazione del sistema *SQL, le cose cambiano:

L’oggetto Libreria creato appartiene al profilo utente con lo stesso nome dello schema o se non esiste all’utente che ha creato lo schema.

Non importa se il profilo utente è assegnato a un profilo di gruppo, il proprietario ha tutti i diritti sull’oggetto ed è l’unico che può accedere all’oggetto.

L’autorizzazione *PUBLIC è sempre impostata su *EXCLUDE ovvero il valore di sistema QCRTAUT viene ignorato.

Creazione di oggetti database con di denominazione SQL , anche qui cambia

Se un oggetto database viene creato in uno schema / libreria utilizzando comandi SQL con convenzioni di denominazione SQL, il proprietario è il profilo utente che ha creato l’oggetto.

Tuttavia, se il profilo utente è assegnato a un profilo di gruppo ed è memorizzato nel profilo utente che il profilo di gruppo diventa il proprietario degli oggetti creati, il profilo di gruppo diventa il proprietario dell’oggetto.

Tuttavia, le due regole sopra menzionate (proprietario = utente e proprietario = profilo gruppo) si applicano solo se non esiste un profilo utente corrispondente al nome dello schema / libreria in cui deve essere creato l’oggetto.

Se è disponibile un profilo utente corrispondente, questo profilo utente diventa il proprietario dell’oggetto.

Sebbene non sia possibile assegnare autorizzazioni a uno schema / libreria utilizzando i comandi SQL, è possibile utilizzare i seguenti comandi SQL per assegnare o revocare le autorizzazioni agli oggetti del database all’interno di uno schema / libreria:

L’istruzione SQL GRANT può essere utilizzato per assegnare autorizzazioni per utenti, profili di gruppo, ma anche per *PUBLIC a tabelle e viste, nonché a procedure memorizzate e funzioni definite dall’utente.

Le autorizzazioni assegnate con i comandi SQL, tuttavia, differiscono dalle autorizzazioni assegnate con i comandi CL, se un utente riceve tutte le autorizzazioni tramite il comando SQL GRANT con *ALL, può modificare un oggetto ma non eliminarlo!

D’altra parte, è possibile assegnare autorizzazioni di colonna o campo all’interno delle tabelle o dei file fisici utilizzando il comando SQL GRANT.

L’istruzione SQL REVOKE revoca le autorizzazioni è il contrario di GRANT.

Le istruzioni SET SESSION AUTHORIZATION e SET SESSION USER possono influire sulla proprietà e sulle autorizzazioni degli oggetti quando si lavora con la convenzione di denominazione SQL .

Dopo aver stabilito una connessione, il profilo utente può essere commutato in un profilo utente diverso (ID autorizzazione) per adottare le autorizzazioni di accesso di questo profilo utente utilizzando le istruzioni SET SESSION AUTHORIZATION o SET SESSION.

Hai già appreso come il valore del profilo utente viene applicato alla proprietà e alle autorità degli oggetti durante la creazione di oggetti con SQL Naming quindi presta attenzione.

Creazione/ricerca di oggetti di database con denominazione *SYS senza uno schema puntato

Se un oggetto di database viene creato non qualificato utilizzando le convenzioni di denominazione del sistema, l’oggetto viene creato nella CURLIB.

Tuttavia, se una libreria corrente è stata impostata utilizzando il comando CL CHGCURLIB (modifica libreria corrente), l’oggetto database viene creato in questa libreria.

Se una libreria / schema corrente è stato specificato utilizzando SQL utilizzando il comando SET CURRENT SCHEMA SQL, l’oggetto viene creato in questa libreria, anche se è stata specificata un’altra libreria corrente utilizzando il comando CL CHGCURLIB.

Creazione/ricerca di oggetti di database con denominazione *SQL senza uno schema puntato

Se un oggetto di database viene creato senza qualifica utilizzando le convenzioni di denominazione SQL, viene effettuato un tentativo di generare questo oggetto in una libreria / schema che corrisponde al nome del profilo utente che desidera creare l’oggetto.

Se una libreria corrispondente non è disponibile, viene emesso un messaggio di errore e l’oggetto non viene creato.

Se uno schema / libreria corrente è stato specificato utilizzando il comando SQL SET CURRENT SCHEMA, l’oggetto viene creato in questa libreria, proprio come quando si usano le convenzioni di denominazione SQL.

Conclusioni

Viste le differenze tra le due convenzioni di denominazione spero di aver fatto un po di chiarezza su eventuali problematiche che vi possano capitare, alla prossima.

Dario Carnevale Schianca

Rispondi

%d blogger hanno fatto clic su Mi Piace per questo: