Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
LAUREANDO RELATORE
Paolo Manfrin Chiar.mo Prof. Alberto Bartoli
A.A. 2007/2008
Ringraziamenti
iii
Indice
1 Introduzione 1
2 Analisi 3
2.1 Descrizione del Problema . . . . . . . . . . . . . . . . . . 3
2.1.1 Contesto Aziendale . . . . . . . . . . . . . . . . . . 3
2.1.2 Overview Sistemi ed Entità . . . . . . . . . . . . . 4
2.1.3 Pratica Interna . . . . . . . . . . . . . . . . . . . . 4
2.1.4 Software Preesistente . . . . . . . . . . . . . . . . . 6
2.2 Analisi del Problema . . . . . . . . . . . . . . . . . . . . . 6
2.2.1 Definizione del Problema . . . . . . . . . . . . . . . 7
2.3 Analisi dei Requisiti . . . . . . . . . . . . . . . . . . . . . 8
2.3.1 Vincoli di progetto . . . . . . . . . . . . . . . . . . 8
2.3.2 Casi d’uso . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.3 Planning delle attività . . . . . . . . . . . . . . . . 10
v
INDICE vi
4 Implementazione 33
4.1 Moduli A e B . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.1.1 Properties Framework . . . . . . . . . . . . . . . . 33
4.1.2 Gli oggetti serializzabili . . . . . . . . . . . . . . . 34
4.1.3 Server Listener . . . . . . . . . . . . . . . . . . . . 36
4.1.4 Schema Logico Database (Schema Properties) . . . 38
4.1.5 Stored Procedures . . . . . . . . . . . . . . . . . . 38
4.1.6 Indici . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.1.7 Triggers e Jobs . . . . . . . . . . . . . . . . . . . . 45
4.1.8 Transazioni . . . . . . . . . . . . . . . . . . . . . . 47
4.1.9 IO Risultati da server . . . . . . . . . . . . . . . . 50
4.2 MODULO C . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2.1 Applicazione BackupManager . . . . . . . . . . . . 53
4.2.2 Shrink Distribuito . . . . . . . . . . . . . . . . . . 53
4.2.3 Schema Logico Database (Schema BackupManager) 58
4.3 MODULO D . . . . . . . . . . . . . . . . . . . . . . . . . 60
5 Risultati ottenuti 65
5.1 Moduli A e B . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.2 Modulo C . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.3 Modulo D . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
6 Conclusioni e Raccomandazioni 71
6.1 Miglioramenti moduli A e B . . . . . . . . . . . . . . . . . 71
6.2 Miglioramenti modulo C . . . . . . . . . . . . . . . . . . . 72
6.3 Considerazioni Finali . . . . . . . . . . . . . . . . . . . . . 72
Acronimi 95
Elenco delle figure
3.1 Channel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Listener . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.3 Properties Framework . . . . . . . . . . . . . . . . . . . . 14
3.4 Modello di Accesso ai dati . . . . . . . . . . . . . . . . . . 16
3.5 Schema definiti nel database TEC . . . . . . . . . . . . . . 19
3.6 Modello E-R Schema Properties . . . . . . . . . . . . . . . 20
3.7 Servizi Offerti da Properties Framework . . . . . . . . . . 21
3.8 Numero database ripristinati su server . . . . . . . . . . . 23
3.9 Totale spazio annualmente allocato sui server . . . . . . . 23
3.10 TEC 3 - GUI Richiesta ticket . . . . . . . . . . . . . . . . 25
3.11 Snapshot Sequoia . . . . . . . . . . . . . . . . . . . . . . . 27
3.12 Overview Backup Manager . . . . . . . . . . . . . . . . . 28
3.13 Modello E-R Schema BackupManager . . . . . . . . . . . 29
3.14 Workflow Attuale . . . . . . . . . . . . . . . . . . . . . . . 30
3.15 Workflow Ridefinito . . . . . . . . . . . . . . . . . . . . . 31
vii
ELENCO DELLE FIGURE viii
ix
Capitolo 1
Introduzione
1
1. Introduzione 2
Alcuni dei moduli sviluppati fanno già parte dell’applicativo Test En-
vironement Center 4.0, attualmente in fase di sviluppo dall’ SDK Team
di SAP Business One. Altri verranno integrati in un secondo momento,
una volta ultimata la fase di testing. Il nuovo applicativo, già in uso da
alcuni consulenti pilota, andrà a sostituire il precedente nei prossimi mesi
e verrà esteso a tutte le sedi di supporto di SAP Business One.
Durante lo sviluppo della tesi, a stretto contatto con i consulenti
SAP, si è inoltre evidenziato un possibile miglioramento produttivo rag-
giungibile modificando il workflow attualmente in essere. Tale modifica
è stata proposta al SAP System Leader, il quale sta valutando le risorse
da destinare alla implementazione della soluzione proposta.
Per quanto concerne il raggiungimento degli obiettivi, i consulenti
sono ora in grado di eseguire query, senza la necessità di ricorrere a MS
Sql Server Management Studio come dovevano fare in precedenza, nella
maggior parte dei casi.
L’interfaccia software creata consente agli sviluppatori di interagire
con le basi dati senza la necessità di conoscerne i dettagli come la loca-
lizzazione fisica sui server e le stringhe di connessione, consentendo loro
di rimanere concentrati nei moduli che devono sviluppare.
Le problematiche di cui soffriva la server farm sono state in parte
risolte introducendo l’operazione di shrinking sui database e cambiando
i parametri relativi alle stored procedures di eliminazione dei database.
Gli applicativi software utilizzati sono stati Visual Studio 2005, Sql
Server 2000, Sql Server 2005, Sql Profiler, Tortoise SVN per la gestione del
versioning, Sequoia e SAP Business One. Il linguaggi di programmazione
utilizzati sono stati C# e Sql.
Il capitolo 2 inizia discutendo i problemi da risolvere, l’analisi dei
requisiti ed i casi d’uso. Il capitolo 3 riporta il progetto del sistema e della
base dati, seguito dal capitolo 4 in cui viene descritta l’implementazione
del sistema. La trattazione continua con il capitolo 5 in cui vengono
analizzati i risultati e si conclude nel capitolo 6 con la proposta di ulteriori
miglioramenti.
Capitolo 2
Analisi
3
2. Analisi 4
Le interfacce sono di tipo 1-1 tra cliente finale e Partner SAP, Partner
SAP e GSC, GSC e IBD come illustrato in figura 2.1.
END
SAP PARTNER GSC IBD
CUSTOMER
FTP Server
TEC Server
TEC
COMPANY-DB Ticket
Patch Level (PL)
IBD
Version (V)
Db Type
SBO-COMMON TEC Application
TEC Appication Server
CSN
Message
GSC
TEC Server
CSN Application
PARTNER SAP
SAP Business One è un ERP per piccole medie aziende (fino a 100
clients) con architettura client/server 2 tiers. Tale architettura usa il pre-
sentation client per far eseguire la logica applicativa e si basa su un server
condiviso per il mantenimento dei dati. I database attualmente suppor-
tati sono Microsoft SQL Server 2005 e IBM DB2. Versioni precedenti
eseguivano invece su SQL Server 2000 [3].
B1 si basa su due database:
• SBO-COMMON che contiene impostazioni di default e pacchetti di
installazione per una certa versione di SAP B1.
• COMPANY-DB contenente i dati cliente.
Si noti che più COMPANY-DB possono condividere lo stesso SBO-COMMON.
L’unico requisito è che la versione (V) e la Patch Level (PL) dei due sia
la medesima.
Una istanza di SAP B1 è completamente definita dalla versione, la
patch level e il tipo di database (SQL 2000, SQL 2005, DB2).
I GSC Consultant usano attualmente un applicativo chiamato CSN
dove possono vedere i messaggi inseriti dai partner (ogni partner è iden-
tificato da un identificativo). Dopo che il messaggio è stato inserito nel
2. Analisi 6
CSN esso può essere inoltrato da consulente a consulente allo stesso livello
(ad esempio da un consulente GSC ad un altro consulente GSC) oppure
può essere inoltrato ad un altro livello (verso l’interno: IBD, verso l’e-
sterno: Partner). Il messaggio rappresenta il centro di tutto il sistema in
quanto raccoglie tutte le informazioni relative al cliente (Customer ID,
...), il Partner (Partner ID, ...), la versione di B1 (V, PL, DB type).
Quando il GSC Consultant comincia a risolvere un messaggio, egli ha
la possibilità di connettersi remotamente al partner o al cliente per ana-
lizzare il problema. Nel caso in cui non sia possibile fornire una soluzione
da remoto, allora il partner deve trasferire il backup del
COMPANY-DB in una cartella SFTP assegnata dal consulente.
Una volta caricato il DB, il consulente GSC registra il messaggio nel
TEC. TEC è un applicativo usato per importare i COMPANY-DB inviati
dai partner nel corretto SAP server, dove i consulenti possono fare il login
e risolvere i problemi che affettano la base dati.
Spesso si richiede (specialmente per i membri del System Team) di ese-
guire determinate query nel database. Le informazioni relative al server
e alla base dati a cui connettersi sono salvate in TEC.
[MODULO A]
Esecuzione e salvataggio di query remote. Il problema attualmen-
te evidenziato dai consulenti è l’assenza di una gestione automatizzata
delle query da eseguire. Ogni qualvolta il consulente GSC deve reperire
informazioni dalla base dati, egli deve ricorrere a Sql Server, selezionare
il database su cui deve essere eseguita la query, ricordare la query da
eseguire o selezionarne una da un repository, eseguirla e salvarne il risul-
tato. Il risultato è tipicamente riportato a mano, copiato in un file excel
o un’altra tabella temporanea.
[MODULO B]
Automazione di routine durante i processi di ripristino, upgrade
e backup della base dati. La versione attuale di TEC (3.0) non prevede
alcun metodo per poter eseguire query preconfigurate. Ogni qual volta
uno sviluppatore deve aggiungere, modificare o eliminare alcuni task, egli
deve riscrivere nuovo codice o modificare il codice preesistente, toccando
l’applicativo. Anche in questo caso si avverte la necessità di avere un
repository per le query da eseguire.
2. Analisi 8
[MODULO C]
Migliorare la gestione della server farm. Condurre una analisi al
fine di rilevare le ragioni principali per cui TEC 3.0 fallisce, dove con
fallimento si intende che il Db non è stato correttamente ripristinato sulla
corretta istanza e risulta quindi non accessibile da parte del consulente
GSC.
[MODULO D]
Migliorare il workflow aziendale. Analizzare il processo aziendale
interno del GSC System Team ed evidenziare, se possibile, i workflow più
lenti proponendo ed implementando, una volta approvata, una possibile
soluzione.
• La base dati deve essere Sql Server 2005 per omogeneità con la base
dati utilizzata da SAP Business One. E’ prevista una migrazione
successiva a Sql Server 2008.
TEC
«extend»
TECUser
2. Execute Query &
Sav e Result
«extend» 8. TEC Client
«extend»
3. Upgrade Manager
«extend»
«extend»
«communicate»
TECAdmin
5. Query Admin
«use»
TEC Database
7. Upgrade, Backup,
Restore
11
3. Progetto del Sistema 12
TEC User
SAP VPN
TEC User
pwdf6541
Serializable Objects
- Query
- Result
- Event
- Db Type
CLIENT SERVER
CHANNEL CHANNEL
CHANNEL
LISTENER
TEC DB
SERVER
CHANNEL
LISTENER FRAMEWORK
TEC DB
SERVER
• I dati di ritorno di una stored procedure sono usati per creare una
nuova stringa T-SQL.
CHANNEL TABLE
Viste
Si è deciso di interfacciare le stored procedures con delle viste piuttosto
che interfacciarle direttamente con le tabelle. Questa decisione è stata
presa a seguito delle seguenti considerazioni:
Lo svantaggio principale derivante dall’uso delle vista sta nel fatto che,
in caso di modifica ad una determinata tabella, referenziata da viste
17 Moduli A e B: Generic Query
Schema
• B1
• BackupManager
• Core
• Infrastructure
• Internal
• Properties
• Security
QUERY
HA una descrizione
PUO’ riferire ad una SAP note
PUO’ essere pubblica
HA il testo della query
PUO’ avere un ordine di esecuzione
HA una data di modifica
HA uno timestamp di modifica
E’ ASSOCIATA ad un evento
E’ inserita da un TECAdmin
PUO’ produrre dei risultati
PUO’ essere eseguita su un solo specifico tipo di database
RESULT
HA un risultato di esecuzione
E’ ASSOCIATO ad una query
E’ PRODOTTO da un utente
APPARTIENE ad un ticket
HA una data di modifica
HA un timestamp di modifica
PUO’ essere un risultato d’errore
BATCH
HA un ID di esecuzione
HA uno Stato
PUO’ generare nessuno, uno o più risultati
class Db Schemas
Db Schemas
B1 Properties Infrastructure
BackupManager
RELAZIONI
QUERY può generare zero o più RISULTATI
RISULTATO può essere generato da una e una sola QUERY
QUERY è inserita da uno ed un solo TECADMIN
TECADMIN può inserire zero o più QUERY
QUERY può essere eseguita su una ed una sola ENTITà
ENTITA’ può essere oggetto di zero o più QUERY
QUERY può generare un RISULTATO di errore
RISULTATO è output di una ESECUZIONE
TECUSER può eseguire una o più ESECUZIONI
RISULTATO può appartenere a un BATCH di esecuzione
Un BATCH di esecuzione può generare uno o più risultati
Una QUERY può eseguire come BATCH
EventID
EntityID Properties.Entity Properties.Event Description
Description
0,N 0,N
ON RAISE
0,1
1,1
0,N
0,N
0,1 TicketID
0,N 1,1 Core.Ticket
TECUserID Security.TECUser EXECUTE
0,N
Properties.Batch BELONG
1,1
BatchID
0,N StatusID
1,1 OWN Properties.Status Description
IPropertiesFramework
EXEC Line
EXECUTE A GET LIST OF GET LIST OF GET LIST OF GET LIST OF GET A SPECIFIC GET LIST OF
SAVE A RESULT SAVE A QUERY
QUERY QUERY RESULT ENTITIES EVENTS RESULT BATCH
GetQueryResult
GetQueryList GetEntityList GetEventList GetSavedResult GetBatchList
List
SaveResult SaveQuery ALREADY 7 8 9 10 11 12
1 2 Y STORED ON N
DB
CHECK
Y BEFORE N GetRemoteQueryResult
SAVING 6
TIME
GetSavedQueryResult Y CONSUMING N
3 QUERY
ExecuteAndSave ExecuteAndSave
ResultAsync Result
4 5
2 SetQuery 8 GetQueryResultList
3 GetSavedQueryResult 9 GetEntityList
Moduli A e B: Generic Query
6 GetRemoteQueryResult 12 GetBatch
possibili flessi dovuti alle minori richieste di supporto data l’attuale si-
tuazione economica a livello mondiale.
Sulla base di tali considerazioni è quindi necessario ottimizzare l’u-
tilizzo delle risorse a disposizione invece di fare investimenti economici
puntando sull’acquisto di hardware dedicato (sempre che questo venga
autorizzato dalla dirigenza).
BackupManager SCHEMA
ServerManager
BackendRootList
1. ServerManager()
GetBackendRootList
COLLECT DATA 2.
TEC_LIVE
BackendServer 3.
SetServer STORE DATA
Pwdf2660
Directory
SetDirectory
File SetFile
DistributedShrink_V2.sql
RestoredDatabase 4. (STEP 4)
BackendID
BACKEND
Servername SERVER
BackupRoot
0,N
TO HOLD
1,1
DirectoryID
NumFiles
Name DIRECTORY
CreationTime
LastAccessTime
0,N
TO HOLD
1,1
FileID
Name FILE
Type
act Workflow
Message
Processing
CONSULTING
Upg?
UPGRADE
GO TO Pick a new message
UPG. NOTIFICATION
Failure? Y
UPG. FAILURE
N ANALYSIS
UPG. NOTIFICATION
Upg?
Y
UPG. NOTIFICATION
N
MESSAGE SOLVING
End Message
Processing
act Workflow
Message
Processing
CONSULTING
Upg?
UPGRADE
UPG. NOTIFICATION
Failure?
FORCED UPGRADE
UPGRADE NOTIFICATION
Failure? Y
UPG. FAILURE ANALYSIS
N
N
PROBLEM SOLVING
GO TO Message Solving
UPG. NOTIFICATION
Upg?
Y
Recurrent?
Y
UPG. ISSUE
KNOWLEDGE
N TRANSFER
UPG. NOTIFICATION
N
MESSAGE SOLVING
End Message
Processing
4.1 Moduli A e B
4.1.1 Properties Framework
L’interfaccia IPropertiesFramework e la sua implementazione è mostrata
in figura 4.1.
I parametri in input ai metodi sono tutti di tipo primitivo, per omo-
geneità con la base dati cui i parametri verranno passati. I risultati in
output sono tipi primitivi, DataSet e DataTable. Per poter essere utiliz-
zati in modo opportuno, il programmatore deve essere a conoscenza della
struttura dei DataSet e dei DataTable tornati dall’interfaccia.
In particolare i DataSet sono sempre tornati in seguito all’esecuzione
di una query, i DataTable sono invece tornati ogni qual volta vengono
acquisiti dati (siano essi relativi a Query, Result, Batch, ...) dalla base
dati.
Particolare attenzione è stata posta nel metodo ExecuteAndSaveRe-
sultAsync. Questo metodo riceve come parametri di ingresso il QueryID
della query da eseguire, il ticketID sul quale la query deve essere eseguita
e il TECUSerID dell’utente che sta effettuando l’operazione. Tale metodo
deve eseguire in modalità asincrona per non bloccare l’applicativo client.
Le possibilità analizzate sono state l’uso di un pool di thread e i thread
multipli.
In particolare sono state evidenziate le seguenti informazioni:
• Non ci sono priorità differenti tra thread diversi
• Il thread può eseguire per un tempo relativamente lungo ma l’ela-
borazione vera e propria (l’esecuzione della query) viene eseguita in
un server diverso da quello dove il thread viene creato ovverosia nel
server dove è fisicamente allocato il database target della query.
33
4. Implementazione 34
«interface»
IPropertiesFramework
+ ExecuteAndSaveResult(int?, int?, int?, int?) : bool
+ ExecuteAndSaveResultAsync(int?, int?, int?) : int
+ GetEntityList() : DataTable
+ GetEventList() : DataTable
+ GetQueryList(bool) : DataTable
+ GetQueryResultList(int?) : DataTable
+ GetRemoteQueryResult(int?, string, int?) : DataSet
+ GetSavedQueryResult(int?, int?) : DataSet
+ GetSavedResult(int?) : DataTable
+ SaveQuery(string, int?, int?, string, bool?, int?, int?, int?) : int
+ SaveResult(int?, int?, int?, DataSet, int?) : bool
PropertiesFramew orkImpl
- delegateExecuteAndSaveResult: DelegateExecuteAndSaveResult
In tal caso si può fare riferimento alla struttura database creata, che
fornisce utili informazioni circa la struttura degli oggetti:
• un Risultato è sempre associato ad una Query
CAO: Sono creati sul server immediatamente alla richiesta del client.
Un’istanza di un oggetto CAO è creata ogni qual volta un client ne istan-
zia una ed il tempo di vita è controllato dal client. La logica dei metodi
CAO viene gestita nel proxy del client.
IEquatable
Query
+ Equals(Result) : bool
+ Add() : Query
+ ExecuteAndSaveResult(Query, Ticket) : void
+ Delete() : void
+ ExecuteAndSaveResultAsync(Query, Ticket) : void
+ Equals(Query) : bool
+ Get(string) : Query -r_query + GetAll(T icket) : List<Result>
+ GetAll(Query, Ticket) : List<Result>
+ GetAll() : List<Query>
+ GetByKey(int) : Result
+ GetAll(Event) : List<Query>
+ GetQueryResultList(Ticket) : DataTable
+ GetByKey(int?) : Query
+ GetResult(Query, T icket) : DataSet
+ Query(int, string, int?, bool, int?, string, int?, byte[], Event, Entity)
+ GetSavedQueryResult(Query, T icket) : DataSet
+ Query(string, int?, bool, int?, string, int?, Event, Entity)
+ Result(int, Query, int, byte[], DateTime, int)
+ ToString() : string
+ Result(int, Query, int, byte[], DateTime, DataTable)
+ Update() : Query
+ T oString() : string
«property»
«property»
+ Entity() : Entity
+ BatchID() : int
+ Event() : Event
+ DateTime() : DateT ime
+ ID() : int?
+ ExecutionResult() : DataT able
+ IsPublic() : bool
+ ID() : int
+ Order() : int?
+ Query() : Query
+ SAPNote() : int?
+ T ECUserID() : int
+ TECUserID() : int?
+ T imeStamp() : byte[]
+ Text() : string
+ TimeStamp() : byte[]
+ Title() : string
-q_Entity -q_Event
IEquatable IEquatable
Entity Ev ent
- e_description: string - e_ID: int
- e_ID: int - e_name: string
Avere la logica sul client non garantisce che l’applicativo utilizzi sem-
pre la versione più aggiornata dei metodi e in caso di aggiornamento dei
metodi sul server è necessario provvedere a riavviare gli applicativi client
onde evitare comportamenti indesiderati. Questo esclude la possibilità di
utilizzare gli oggetti di tipo CAO. Riguardo gli oggetti SAO, dato che si
vogliono fornire servizi indipendenti ai diversi client ed essi non devono
condividere uno stato comune, si è scartata anche la possibilità di uti-
lizzare gli oggetti di tipo Singleton. La scelta finale ricade dunque negli
oggetti SAO SingleCall.
Il Listener sarà composto da una unica classe Listener, che conterrà
l’elenco di tutti gli oggetti SAO SingleCall richiamabili dagli applicativi
client. Ognuno di tali oggetti implementerà l’interfaccia per consentire le
chiamate remote da client. La struttura base del listener è riportata in
appendice C.
In questa tesi sono state sviluppate, oltre al listener, le classi QueryLo-
cal che implementa l’interfaccia IQuery, EventLocal che implementa l’in-
terfaccia IEvent, ResultLocal che implementa l’interfaccia IResultAdmin,
EntityLocal che implementa l’interfaccia IEntity.
L’interfaccia IQuery permette le operazioni di aggiunta, modifica ed
eliminazione di una query su database. Essa permette inoltre di ritornare
un oggetto serializzabile Query al client. L’interfaccia IEvent permette di
aggiungere, modificare ed eliminare un evento su database. Essa inoltre
permette di ritornare una lista di oggetti serializzabili Event al client.
L’interfaccia IEntity permette di aggiungere modificare ed eliminare un
entità su database. Essa inoltre permette di ritornare una lista di oggetti
serializzabili Entity al client.
L’interfaccia IResultAdmin estende l’interfaccia IResult. IResult con-
sente di ritornare al client un oggetto Result cercandolo per ID, ritornare
una lista di Result fornendo alcuni parametri di ricerca, ritornare il da-
tatable che rappresenta il risultato, eseguire una certa query e salvare il
risultato.
Gli altri servizi offerti dal Listener, non essendo stati sviluppati dal-
l’autore, non trovano trattazione nel seguito.
Le classi QueryLocal, EventLocal, ResultLocal e EntityLocal istan-
ziano al momento della creazione, l’oggetto che implementa l’interfaccia
IPropertiesFramework per l’iterazione con il database.
«interface»
PropertiesFramework::IPropertiesFramework
+ ExecuteAndSaveResult(int?, int?, int?, int?) : bool
+ ExecuteAndSaveResultAsync(int?, int?, int?) : int
PropertiesFramew ork::PropertiesFramew orkImpl
+ GetEntityList() : DataTable
+ GetEventList() : DataTable
+ GetQueryList(bool) : DataTable
+ GetQueryResultList(int?) : DataTable
+ GetRemoteQueryResult(int?, string, int?) : DataSet
+ GetSavedQueryResult(int?, int?) : DataSet
+ GetSavedResult(int?) : DataTable -propertiesFwkHandler
+ SaveQuery(string, int?, int?, string, bool?, int?, int?, int?) : int MarshalByRefObject
+ SaveResult(int?, int?, int?, DataSet, int?) : bool PropertiesFramew ork::EntityLocal
-propertiesFwkHandler -resultHandler-propertiesFwkHandler - propertiesFwkHandler: IPropertiesFramework
MarshalByRefObject
«interface»
PropertiesFramew ork::Ev entLocal
TEC::IEntity
- propertiesFwkHandler: IPropertiesFramework + Add(Entity) : Entity
+ Delete(Entity) : void
+ GetAll() : List<Entity>
+ Update(Entity) : Entity
«interface» MarshalByRefObject
TEC::IEvent PropertiesFramew ork::QueryLocal
+ Add(Event) : Event - propertiesFwkHandler: IPropertiesFramework
+ Delete(Event) : void
+ GetAll() : List<Event>
+ Update(Event) : Event
«interface»
TEC::IQuery
+ Add(Query) : Query
+ Delete(Query) : void
+ Get(string) : Query
MarshalByRefObject + GetAll() : List<Query>
+ GetAll(Event) : List<Query>
PropertiesFramew ork::ResultLocal
+ GetByKey(int?) : Query
- resultHandler: IPropertiesFramework + Update(Query) : Query
«interface»
TEC::IResult
«interface»
+ ExecuteAndSaveResult(Query, Ticket) : bool
TEC::IResultAdmin
+ ExecuteAndSaveResultAsync(Query, Ticket) : void
+ Add(Result) : Result + GetAll(int?) : List<Result>
+ Delete(Result) : Result + GetAll(Query, int?) : List<Result>
+ Update(Result) : Result + GetByKey(int?) : Result
+ GetQueryResultList(Ticket) : DataTable
+ GetResult(Query, Ticket) : DataSet
+ GetSavedQueryResult(Query, Ticket) : DataSet
TECUser
Query
Entity PK TECUserID
PK QueryID
PK EntityID U1 NTUserName
U1 QueryDescription Result FirstName
Description FK1 FK_EntityID LastName
SAPNote PK ResultID
EMail
IsPublic LastLoginDate
FK3 FK_TECUserID FK3 FK_QueryID
FK_DepartmentID
Event QueryText FK4 FK_TECUserID
Active
FK2 FK_EventID ExecutionResult
TimestampChg
PK EventID QueryOrder FK1 FK_TicketID
TimestampDate
TimestampChg TimestampChg
Description TimestampDate TimestampDate
FK2 FK_BatchID
Error
Ticket
PK TicketID
FK_CompanyBackupID
Batch
FK_CompanyDatabaseID
Status PK BatchID FK_TicketStatus
TicketStatusDate
PK StatusID
FK3 FK_StatusID FK1 FK_OwnerID
RequestTime TicketCreationDate
Description
FK2 FK_QueryID TimestampChg
FK1 FK_TicketID U1 ComputCol
TimestampDate
[Properties].[LinkedServerConn]
La stored procedure [Properties].[LinkedServerConn] crea una connessio-
ne tramite linked server al database remoto selezionato sulla base dei pa-
rametri in ingresso e ritorna il nome stesso del linked server. I parametri
di ingresso sono:
• SBOCommon: HOST_INSTANCE_TICKETID_COM___
La stored procedure, una volta determinato il percorso al linked ser-
ver, verifica se questo è già presente nella tabella master.sys.sysservers
(tabella ove vengono memorizzate tutte le connessioni a Db remoti). Nel
caso in cui un linked server non sia già presente, esso viene creato al
momento.
[Properties].[GetRemoteQueryResult]
Questa SP è utilizzata per eseguire una query su un server remoto. I
parametri di input sono:
[Properties].[GetSavedQueryResult]
Questa query esegue una query su linked server remoto e torna il risul-
tato. A differenza di [Properties].[GetRemoteQueryResult], la query da
eseguire in questo caso è salvata su db. Tale SP è pensata per l’esecu-
zione di query ricorrenti, ossia query comunemente eseguite durante le
procedure di pre/post-restore, pre/post-backup. Gli unici parametri di
ingresso sono in questo caso il TicketID e il QueryID. L’uscita è data dal
Result Set.
4. Implementazione 42
EntityID: 1 – CompanyDB
2 – SBOCOmmon
intTicketID
GetHostInstance
strHost strInstance
LinkedServerConn
strLinkedServer
ExecRemoteQuery
[Properties].[GetHostInstance]
[Properties].[ExecRemoteQuery]
4.1.6 Indici
La scelta degli indici si basa sulla quantità di dati contenuti nelle diverse
tabelle, sui campi di ricerca più utilizzati, il grado di INSERT e UPDATE
confrontato con le operazioni di SELECT.
Nelle tabelle Event, Entity e Status è stato inserito un indice non
clustered per garantire l’unicità della descrizione (Description).
43 Moduli A e B
GetSavedQueryResult
intTicketID intQueryID
VIEW_Query
SELECT performed
intTicketID
strQueryText
intEntityID
strRemoteQuery
GetRemoteQueryResult
15 -- Complete update
16 RETURN
17 END
18 ELSE
19 BEGIN
20 ROLLBACK
21 RETURN
22 -- EXIT POINT
23 END
24
25 END
26
27 IF EXISTS(SELECT * FROM INSERTED) -- Is an INSERT
28 BEGIN
29 PRINT ’INSERT’;
30
31 IF -- Is admin or manager
32 BEGIN
33 -- Complete admin
34 RETURN
35 END
36 ELSE
37 BEGIN
38 ROLLBACK
39 RETURN
40 -- EXIT POINT
41 END
42 END
43 ELSE
44 PRINT ’DELETE’;
45 -- delete is always executed. Must be combined in
46 -- Properties.DeleteQuery
4.1.8 Transazioni
Le stored procedure non sono di per sè transazionali e deve pertanto essere
condotta una verifica per ciascuna stored procedure al fine di individuare
il livello di isolamento più opportuno, tenuto conto delle proprietà di
atomicità, consistenza, isolamento e persistenza delle transazioni [16],
secondo la figura seguente:
In tabella 4.1 sono stati analizzati, stored procedure per stored pro-
cedure, i fenomeni permessi sulla base dei quali è stato scelto il livello
di isolamento in grado di soddisfare le restrizioni imposte usando come
riferimento per la scelta la tabella di figura 4.7.
4. Implementazione 48
Stored Procedure Phantoms Non Repet. Read Dirty Read Lost Updates Transaction
GetBackendRootList Allowed Allowed Not Allowed Not Allowed READ COMMITTED SNAPSHOT
Reset Allowed Allowed Allowed Allowed READ UNCOMMITTED
SetDirectory Allowed Allowed Allowed Allowed READ UNCOMMITTED
SetFile Allowed Allowed Allowed Allowed READ UNCOMMITTED
SetServer Allowed Allowed Allowed Allowed READ UNCOMMITTED
DeleteQuery Allowed Allowed Not Allowed Not Allowed READ COMMITTED SNAPSHOT
ExecRemoteQuery Not Allowed Not Allowed Not Allowed Allowed SNAPSHOT
GetBatch Allowed Allowed Not Allowed Allowed READ COMMITTED SNAPSHOT
GetBatchList Allowed Allowed Not Allowed Not Allowed READ COMMITTED SNAPSHOT
GetEntityList Allowed Allowed Not Allowed Allowed READ COMMITTED SNAPSHOT
GetEventList Allowed Allowed Not Allowed Allowed READ COMMITTED SNAPSHOT
GetHostInstance Not Allowed Not Allowed Not Allowed Allowed SNAPSHOT
GetQueryList Allowed Allowed Not Allowed Allowed READ COMMITTED SNAPSHOT
GetQueryResultList Allowed Allowed Not Allowed Allowed READ COMMITTED SNAPSHOT
GetRemoteQueryResult Not Allowed Allowed Not Allowed Allowed SNAPSHOT
GetResult Allowed Allowed Not Allowed Allowed READ COMMITTED SNAPSHOT
GetSavedQueryResult Allowed Allowed Not Allowed Allowed –
Not Allowed Allowed Not Allowed Allowed –
Not Allowed Allowed Not Allowed Allowed SNAPSHOT
LinkedServerConn Allowed Allowed Not Allowed Allowed –
Not Allowed Allowed Not Allowed Allowed –
Allowed Allowed Not Allowed Allowed –
Not Allowed Allowed Not Allowed Allowed SNAPSHOT
SetBatch Allowed Allowed Not Allowed Not Allowed READ COMMITTED SNAPSHOT
SetQuery Allowed Allowed Not Allowed Not Allowed READ COMMITTED SNAPSHOT
SetQueryResult Allowed Allowed Not Allowed Not Allowed READ COMMITTED SNAPSHOT
SetResult Allowed Allowed Not Allowed Allowed READ COMMITTED SNAPSHOT
11 </xs:complexType>
12 </xs:element>
13 </xs:choice>
14 </xs:complexType>
15 </xs:element>
16 </xs:schema>
17 <Table2>
18 <Version>860035</Version>
19 </Table2>
20 </NewDataSet>
4.2 MODULO C
Il Modulo C fa uso dell’applicativo BackupManager e dello script di
Shrink Distribuito.
53 MODULO C
Serv er
- folderList: List<IFolder>
- name: string
- root: string
+ GetFolderList() : List<IFolder>
+ GetName() : string
+ GetRoot() : string
+ Server(string, string)
Folder
- dirInfo: DirectoryInfo
- fileList: List<IFile>
- parentServer: IServer
«interface»
IServer + Folder(IServer, DirectoryInfo)
-parentServer
+ GetFolderList() : List<IFolder> + GetCreationDate() : DateTime
+ GetName() : string + GetFileList() : List<IFile>
+ GetRoot() : string + GetFolderInfo() : DirectoryInfo
+ GetFolderList(IServer) : List<IFolder>
+ GetLastModification() : DateTime
+ GetName() : string
+ GetNumberOfFiles() : int
+ GetServer() : IServer
File
«interface»
- fileName: string
- fileT ype: string IFolder
- parentFolder: IFolder + GetCreationDate() : DateTime
-parentFolder + GetFileList() : List<IFile>
+ File(IFolder, string, string) + GetFolderInfo() : DirectoryInfo
+ GetFileList(IFolder) : List<IFile> + GetLastModification() : DateTime
+ GetFileType() : string + GetName() : string
+ GetFolder() : IFolder + GetNumberOfFiles() : int
+ GetName() : string + GetServer() : IServer
- recursiveSearch(IFolder, List<IFile>*) : void
«interface»
IFile
+ GetFileType() : string
+ GetFolder() : IFolder
+ GetName() : string
5. Shrinking
I database vengono ordinati per spazio allocato non utilizzato decrescen-
te e viene effettuata l’operazione di shrinking solamente per i database
con spazio allocato non utilizzato sopra una certa soglia (in MB) stabi-
lita dall’utente. La procedura inizia controllando che il database non sia
il tempdb. In tal caso esegue il comando sp_dboption [10] con l’opzio-
ne ’trunc. log on chkpt.’ per troncare il transaction log fino all’ultimo
checkpoint (restore). Si noti che il processo di compattazione non ha lo
scopo di migliorare le prestazioni del database (in realtà le peggiora in
quanto la successiva operazione di inserimento o aggiornamento richie-
derà un incremento della dimensione del file dati che si traduce in una
richiesta di spazio su disco da parte del DBMS al sistema operativo) ma
ha il solo scopo di liberare spazio dal sistema. La successiva operazione è
quella di impostare per ogni database (eccetti master e tempdb) l’opzione
AUTOSHRINK attiva, il che consente di compattare automaticamente
il database ad intervalli regolari. Viene quindi eseguita l’operazione di
Shrink vero e proprio (comando SHRINKDATABASE) con le opzioni
TRUNCATEONLY e NO_INFOMSGS. TRUNCATEONLY garantisce
che lo spazio non allocato venga rilasciato (invece che compattato). Si
noti che solo i file dati sono troncati, mentre i file di log non sono inte-
ressati da tale operazione. Per quanto appena detto, si rende necessaria
anche una operazione di shrink dei file di log, tramite il comando SH-
RINKFILE per tutti i file di log attualmente in uso.
Tale script è stato pensato per essere eseguito come Sql Server Job
schedulato alle ore 20.00 GMT, ossia quando vi è il minor numero di
utenti connessi e quindi minor uso dei server.
BackendServer
PK BackendServerID
HostName
BackupRoot
Directory
PK DirectoryID
Name
CreationTime
LastAccessTime
NumFiles
FK1 FK_BackendServerID
RestoredDatabase
File
PK FileID server_type
linked_server
Name database_name
Type database_size
FK1 FK_DirectoryID unallocated_space
4.3 MODULO D
In questa sezione viene descritto come implementare la modifica al work-
flow proposto, riportato in figura 3.15.
Per implementare il modulo di Forced Upgrade Process (FUP) devono
essere definito un [Properties].[EVENT] a livello DB per ognuna delle
sezioni GSC (sezioni diverse possono consentire o meno l’esecuzione di
determinate query, a seconda del problema in analisi). Ogni EVENT
viene registrato con una Description con prefisso ForcedUpg_ seguita
dal nome della sezione GSC, ad esempio ForcedUpg_SYSTEM per l’area
sistema, ForcedUpg_FINANCE per l’area finanza, e così via.
61 MODULO D
I punti critici, che devono essere valutati dai diversi GTL sono:
5.1 Moduli A e B
Il modulo relativo alla gestione delle query e dei risultati si è rilevato
di immediato utilizzo: altri sviluppatori lo hanno utilizzato per l’auto-
mazione delle operazioni da effettuare immediatamente dopo il restore
di un database (Evento AfterRestore) e prima di un upgrade (Evento
BeforeUpgrade).
L’autore ha inoltre utilizzato quanto sviluppato nei moduli A e B per
estendere le funzionalità del Client TEC, aggiungenfo il PlugIn IVU ripor-
tato in appendice, che fa uso degli eventi IVUPreRecalculation, IVUPo-
stRecalculation e delle query IVU_PreRecalculation_2005, IVU_PreRecalculation_2007,
Diff_OpenQty_OINM_&_Qty_OITW_OITM_FIFO, Item_Neg_Qty_&_Pos_Inv_&_Viceversa,
None_Recalculated_Documents_V5.16, OpenValue_smaller_than_0_for_FIFO_items,
StockDiff_OINM&OITM&OITW_07A.V1.1.
Lo schema Client-Server proposto si è rilevato conforme alle aspettati-
ve, i risultati a video sono fluidi e non si ha percezione di ritardo nel trasfe-
rimento dati. Il server listener è stato popolato dagli altri programmatori
con i moduli da loro sviluppati.
5.2 Modulo C
Come si può vedere dalla Figura 5.1, lo snapshot sui server è decisamente
migliorato (rispetto allo snapshot di figura 3.11): I file di backup non sono
più presenti, i file .ldf (viola) hanno dimensioni inferiori ed è aumentato
65
5. Risultati ottenuti 66
lo spazio occupato dai file .mdf (blu) il che significa un maggior numero
di database gestiti sul server.
Per valutare se tale spazio sia sufficiente a garantire che i server non
vengano saturati, deve essere valutato il carico giornaliero di database
che vengono ripristinati su server.
La permanenza media di un database su server è pari a 45 gior-
ni. Recentemente vengono ripristinati circa 30 database al giorno (come
riportato dal grafico 5.2 della media mobile su 45 giorni).
Mediamente vengono cancellati circa 35 database al giorno (Fig. 5.3).
Questo risultato è in accordo con il dato sulla permanenza media dei
database sui server. Se consideriamo che la dimensione media di un da-
tabase è pari a 3.5GB (più 0.5GB per il backup compresso), lo spazio
giornalmente liberato dall’operazione di shrink consente di sopperire alla
richiesta di 10 database di dimensione media, pari al 33% della richiesta
totale giornaliera.
La differenza tra i database ripristinati e quelli cancellati, rilevata
nell’ultimo periodo, fornisce un ulteriore incremento pari a (35-30) = 5
database pari al 16% della richiesta giornaliera.
67 Modulo C
5.3 Modulo D
Allo stato attuale non è possibile fornire una valutazione sugli obiettivi
preposti dallo sviluppo del Modulo D data la prematura fase di test in
cui si trova.
Capitolo 6
Conclusioni e
Raccomandazioni
71
6. Conclusioni e Raccomandazioni 72
• Ci possono essere più risultati della stessa query dovute a più ese-
cuzioni, anche sullo stesso ticket.
73
A. Raccolta Informazioni per la gestione query 74
• Ogni qual volta viene modificata una tabella nel database, deve
essere possibile identificare se e quando la tabella è stata modi-
ficata. Questo serve data la natura asincrona dell’applicativo da
sviluppare.
75
B. Elenco degli script realizzati 76
(TEC 3)
(TEC 3)
1
2 class Listener
3 {
4 TcpChannel m_tcpChannel;
5 HttpChannel m_httpChannel;
6
7 private void Listen()
8 {
9 try
10 {
11 // ... implements IServerChannelSinkProvider
12 CompressionServerSinkProvider
compressedServerSinkProvider = new ...
13
14 // ... implements IServerFormatterSinkProvider,
IServerChannelSinkProvider
15 BinaryServerFormatterSinkProvider
binaryServerSinkProvider = new ...
16 [...]
17 compressedServerSinkProvider.Next =
binaryServerSinkProvider;
18
19 if (mySettings.Protocol.Equals("tcp")
20 {
21 m_tcpChannel = new TcpChannel(props, null,
compressedServerSinkProvider);
22 ChannelServices.RegisterChannel(m_tcpChannel, true)
;
23 }
24 if (mySettings.Protocol.Equals("http")
25 {
26 m_httpChannel = new HttpChannel(props, null,
compressedServerSinkProvider);
27 ChannelServices.RegisterChannel(m_httpChannel,
false);
28 }
29
30 // register here all services
31 RemotingConfiguration.RegisterWellKnownServiceType(...)
;
79
C. Struttura base del Listener 80
32 [...]
33
34 }
35 catch (Exception ex)
36 {
37 [...]
38 }
39 }
40 }
Appendice D
Setup dell’ambiente di test
e sviluppo
Per poter far funzionare l’ambiente di test devono essere create almeno 2
istanze Sql Server 2005, così nominate:
• (local)
• (local)\INSTANCE2
81
D. Setup dell’ambiente di test e sviluppo 82
85
E. Interfacce Utente Applicativi 86
91
F. Elenco dei server gestiti 92
[1] SAP AG. Database tables reference 2005a sp1. REFDB_2005, 2005.
[cited at p. 1]
93
BIBLIOGRAFIA 94
[16] Davide Mauri. Sequel server 2005 overview. Solid Quality Learning
Article, 2007. [cited at p. vii, 47]
[18] Mathes e altri Schwarzkopf. Java rmi versus .net remoting - architec-
tural comparison and performance evaluation. Seventh International
Conference on Networking, 2008. [cited at p. 12]
B1 Business One
SBO-BC-UPG Upgrade
SBO-BC-ADD AddOn
PL Patch Level
MS Microsoft
95
F. Acronimi 96