Mauro Dalfreddo

My work, my life… my Blog
18/20 - Lavanda e girasoli
settembre 15th, 2009 di Mauro Dalfreddo

Un hack : come attivare tutte le funzionalità di WAST su XP e Vista

Sviluppare ed implementare un sito o un’applicazione web è un processo creativo che può essere più o meno interessante e quindi più o meno divertente…

E quando finisce il divertimento cominciano i grattacapi! Sicuramente qualcuno nel management o il cliente che ha commissionato il progetto o forse noi stessi vorremmo conoscere quantitativamente le sue prestazioni, in termini di tempi di risposta in funzione del numero di utenti.

Infine potremo arrivare a determinare la capacità del sito, ovvero il numero massimo di richieste/sec aventi tempi di risposta decenti (ovvero prima il numero di utenti appena prima del degrado/collasso del sistema)

Load test

Quindi dopo aver sviluppato e pubblicato un sito o una web application conviene affrontare l’annoso problema dei test di carico e della simulazione realistica delle navigazioni degli utenti per:

  • vedere  come si comporta il sistema
  •  se sussitono colli di bottiglia, aree o sottosistemi dove è possibile ottimizzare qualcosa 
  • dove è meglio iniziare ad effettuare il cosiddetto tuning.

Allo scopo si possono trovare vari tools commerciali e opensource.
E’ possibile trovare una lista abbastanza esaustiva dei software all’url http://www.softwareqatest.com/qatweb1.html.

Nell’ultima esperienza personale, non avendo (mai) molto tempo a disposizione mi sono concentrato su alcuni software grafici e interfacciabili con i sistemi Windows Server:
- l’ottimo ma assi costoso Neoload, che permette di controllare e verificare graficamente  tutte le fasi del processo dal design alla fase di test e l’analisi dei risultati
- gratuitamente in casa Microsoft si trovano WCAT (Web Capacity Analysis Tool), largamente programmabile ma solo tramite script,
e WAST (Web Application Stress Tool – Homer ), il ben noto ma vetusto tool grafico.

WAST (o WAS) è uno strumento di simulazione e di carico sviluppato e rilasciato molti anni or sono da Microsoft, ma è un piccolo gioiellino, poichè permette di controllare e verificare graficamente tutte le fasi del processodi test:

  • la registrazione visuale della navigazione effettuata con il browser
  • la creazione dei profili delle pagine di test
  • la definizione degli utenti
  • la distribuzione delle tipologie di test
  • la definizione del pool di macchine che partecipano al test di carico
  • la definizione dei contatori (performance counter) delle macchine oggetto di test
  • la gestione del test vero e proprio, ovvero lo stress del sito o dell’applicazione web
  • la collezione e l’elaborazione dei risultati, anche se in forma testuale.

Purtroppo WAST è supportato ufficialmente solo su Microsoft Windows NT 4.0 SP 4+ e Microsoft Windows 2000, sistemi operativi che ormai non esistono (quasi) più negli ambiti di produzione.

L’installazione su Windows XP và praticamente sempre a buon fine, ed eseguendo WAST si possono sperimentare da subito le varie funzionalità tranne due:

  • non funzionano performance counter
  • non funziona la comunicazione con i client del pool

Su Windows Vista invece si ottiene da subito un errore (Steve Schofield Weblog – WAST on Vista ), ma basta caricare il file msvcp50.DLL in c:\windows\system32 (poiché non è compreso di default nel SO).

Vista l’indubbia utilità dell’applicazione, mi sono intestardito nel far funzionare WAST anche sui SO più recenti…e alla fine, dopo un po’ di analisi e troubleshooting ci sono riuscito.

Performance counters

Per far funzionare la finestra di ricerca e di aggiunta dei performance counters delle macchine remote, nonchè il polling dei valori a runtime, basta copiare nella directory del programma il file pdh.dll, che si trova nella distribuzione di Windows 2000, e che è infatti la libreria che contiene le funzioni per i contatori.

Sicuramente WAS è stato compilato nel 2000 utilizzando quella versione di libreria (5.0.2174.1), mentre su XP c’e’ quella nuova (5.1.2600.3536)

Abilitare le funzionalità relative ai performance counter

Clients

Bisogna tenere presente che WAST è un tool client/server: l’interfaccia client (hclient.exe) colloquia localmente e/o remotamente (con tecnologia DCOM) con un windows service (webtool.exe); inoltre i dati sono resi persistenti su un database access.

Per far funzionare la comunicazione con i client definiti nel pool bisogna quindi  “giocare” con i pemessi DCOM (dcomcnfg.exe).

Si deve ricordare inoltre che, la comunicazione ed in generale i sistemi Microsoft prima del SP2 di Windows XP non erano securizzati di default, e quindi, per far funzionare il nostro WAST su XP, bisogna “rilassare” un pochino la sicurezza.

Abilitare le funzionalità per il pool di client su WAST

 Procedimento:

  1. Eseguire dcomcnfg.exe
  2. Visualizzare le Proprietà di Servizi Componenti – Computer – Risorse Computer
  3. Nel Tab Proprietà predefinite selezionare la casella Abilita servizi Internet COM in questo computer (che di default è deselezionato)
  4. Nel Tab Protezione COM: Modificare i Limiti delle autorizzazioni di accesso abilitare per l’ACCESSO ANONIMO l’accesso remoto;
    Modificare i Limiti delle autorizzazioni di esecuzione e attivazione  abilitare per Everyone l’avvio remoto e l’attivazione remota
  5. Entrare nel dettaglio dei componenti DCOM e aprire le Proprietà di “WebTool”: personalizzare eventualmente le ACL in modo tale che Everyone possa avviare ed attivare remotamente il componente

E il gioco è fatto! Provare per credere…

Risorse

  DLL aggiuntive per WAST su XP

DCOM Settings for WAST on XP

Riferimenti

- How To Install and Use the Web Application Stress (WAS) Tool

http://support.microsoft.com/kb/313559/en-us

- Introducing Microsoft Web Application Stress Tool (BY Jigesh Shah)

http://www1bpt.bridgeport.edu/sed/projects/cs597/Fall_2002/jishah/web_application_stress.htm

- Load Testing Web Applications using Microsoft’s Web Application Stress Tool (By Rick Strahl)

http://www.code-magazine.com/article.aspx?quickid=0001091&page=1

- Download Microsoft Web Application Stress Tool – Homer:

http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1298

- Steve Schofield Weblog – WAST on Vista

http://weblogs.asp.net/steveschofield/archive/2007/03/10/iis7-post-32-web-application-stress-tool-on-vista.aspx

- Recentemente c’e’ stato qualche problema a reperire WAST sul sito Microsoft download, per cui allego il setup, almeno finchè rimarrano tali problemi.

marzo 19th, 2009 di Mauro Dalfreddo

Dopo aver analizzato come applicare la delega in uno schema 3 tier IE-IIS/ASP.NET-SQL Server nel mio articolo precedente Impersonate & delegate, passiamo alla sua applicazione nel solo contesto SQL Server.

Applicare il paradigma della delega (delegation) a SQL Server significa permettere ad un client collegato ad un’istanza di SQL Server di connettersi implicitamente ad un’altra istanza di SQL Server inviandogli le credenziali kerberos dell’utente autenticato da Windows.  Questo paradigma, applicato a Server SQL, è chiamato double hop.

kerb_09

Sotto delegation è proprio l’istanza di SQL Server alla quale l’utente Windows si è connesso (usando l’autenticazione integrata), che impersona quell’utente stesso nelle comunicazioni con altre istanze.  La delegation è richiesta soprattutto nelle query distribuite che utilizzano linked servers.

Implementazione di un double hop

Consideriamo il caso seguente: un utente si logga una workstation e che si connette (per esempio con SQL Management Studio) ad un server all’istanza di SQL Server  SQLSERVER1. L’utente vuole eseguire query distribuite anche verso un database sul linked server SQLSERVER2.

Requisiti per il Client:

  • la login dell’utente deve essere di tipo Windows
  • tale login deve aver diritti di accesso su SQLSERVER1 e SQLSERVER2.
  • in Active Directory,  bisogna verificare che la proprietà ”Account is sensitive and cannot be delegated” non deve essere selezionata.
  • il computer client deve utilizzare per connettersi al DB il protocollo TCP/IP o named pipes.

Requisiti per il primo serverSQLSERVER1 (o in generale per i server intermedi):

  • deve essere stato registrato l’SPN per il server.
  • l’account col quale viene eseguito SQL deve essere “trusted for delegation”.
  • il server deve utilizzare il protocollo TCP/IP o named pipes.
  • il secondo server, SQLSERVER2,  deve essere aggiunto come linked server. Può essere fatto anche eseguendo la stored procedure sp_addlinkedserver:
EXEC sp_addlinkedserver 'SQLSERVER2', N'SQL Server'
  • il linked server deve essere configurato per effettuare il self mapping sulle login interessate (cioè deve essere passato il contesto di sicurezza della login connessa). Si può usare la stored procedure sp_addlinkedsrvlogin:
EXEC sp_addlinkedsrvlogin 'SQLSERVER2', 'true'

La finestra delle proprietà di sicurezza del linked server dovrà essere simile alla seguente figura:

kerb_10

Sotto riporto un utile script da me creato ed utilizzato nella creazione e nella verifica dei linked server utilizzati negli hop.

 

Requisiti per il secondo server SQLSERVER2:

  • Se viene utilizzato il protocollo TCP/IP, bisogna registrare un SPN  in AD.
  • il server deve utilizzare il protocollo TCP/IP o named pipes.

 

DECLARE @sname as nvarchar(50)
SET @sname ='SERVER2' -- Il nome del linked server

-- Se il linkedsrv esiste ià, viene droppato
IF  EXISTS (SELECT srv.name FROM sys.servers srv
WHERE srv.server_id != 0 AND srv.name = @sname)
EXEC master.dbo.sp_dropserver @server=@sname, @droplogins='droplogins'
IF  EXISTS (SELECT srv.name FROM sys.servers srv
WHERE srv.server_id != 0 AND srv.name = @sname)
EXEC master.dbo.sp_dropserver @server=@sname, @droplogins='droplogins'

DECLARE @providerstr as varchar(255)
SET @providerstr= 'DRIVER={SQL Server};SERVER='+ @sname +
';Integrated Security=SSPI;'

-- Creazione del Linked server
EXEC sp_addlinkedserver  
  @server=@sname,   
  @srvproduct='',    
  @provider='SQLNCLI',   
  @datasrc=@sname, 
  @provstr= @providerstr 

EXEC sp_addlinkedsrvlogin @sname, 'true'

-- Verifica se viene utilizzato il self mapping
SELECT uses_self_credential as delegation , S.name
FROM sys.linked_logins as L, sys.servers as S
WHERE S.server_id=L.server_id and S.name=@sname

-- Esecuzione di una query distribuita
-- (bisogna avere i diritti sul secondo server)
EXECUTE('select * from '+@sname+'.master.dbo.sysdatabases')

-- La prossima query deve restituire:
-- net_transport=TCP e auth_scheme=KERBEROS
SELECT net_transport, auth_scheme
FROM sys.dm_exec_connections
WHERE session_id=@@spid

-- La prossima query deve elencare il linked server creato
SELECT * FROM sys.servers where name=@sname

 

Contesti di applicazione simili

Lo schema della delegation può facilmente essere implenmentato per gli altri servizi SQL come Analysis Services, Reporting Services ed Integration Services; bisogna solamente fare attenzione alla fase di registrazione dell’SPN e ai diritti da applicate agli user account ed ai computer account coinvolti.

Per esempio per quanto riguarda Analysis Services l’SPN che deve essere registrato è del tipo:

Setspn.exe -A MSOLAPSvc.3/Fqdn:InstanceName OLAP_Service_Account

 

Riferimenti

MSDN – Security for Linked Servers , Configuring Linked Servers for Delegation

Microsoft – How to configure SQL Server 2005 Analysis Services to use Kerberos authentication

MS Technet – Understanding Kerberos Double Hop

marzo 13th, 2009 di Mauro Dalfreddo

Finalmente trovo un po’ di tempo per continuare la trattazione iniziata in un mio articolo precedente dei Motivi per veicolare il contesto utente fino al database, e a questo rimando dando per scontati alcuni argomenti.

Sono già stati evidenziati i benefici e le caratteristiche dell’utilizzo dell’autenticazione integrata e del contesto utente anche fino all’ultimo livello applicativo (tier). E’ stata poi spiegata la configurazione da  utilizzare in un’archiettura a 3-tier (IE-IIS-SQL) tutta implementata in un unica macchina (single server).

Per capire come il security context di un utente possa essere veicolato esternamente ad un server da un servizio ad un altro,  bisogna comprendere i protocolli di autenticazione utilizzati.

kerb_00

NTLM e Kerberos a confronto

Il protocolli di autenticazione supportati da Windows sono NTLM (NT Lan Manager, fino dalla versione 4.0)  e Kerberos (da Win 2000 in poi).  Mentre NTLM si basa su un meccanismo di  challenge/response (ovvero lo scambio di un hash criptato tra client e server), Kerberos basa la sua architettura sull’esistenza di server autenticatori (KDC, Key distribuition center), che distribuiscono tikets (cifrati e firmati e quindi affidabili) ai client per utilizzare specifici servizi.

I pregi di Kerberos sono:

  • lo standard aperto, basato sull’RFC 4120
  • la maggiore velocità, poiché, diversamente da NTLM, il servizio non deve verificare la validità dell’utente/client presso un DC, ma gli basta semplicemente il ticket stesso
  • la mutua autenticazione, poichè non solo il client si autentica al servizio (come NTLM),  ma il client stesso è certo dell’identità del servizio, poichè solo quello può leggere il ticket fornito
  • supporto per il logon tramite smart card
  • supporto per la delega dell’autenticazione (Authentication delegation o Authentication forwarding): grazie a questa caratteristica un servizio può accedere ad un risorsa remota per conto di un utente.

Quet’ultimo punto sta a significare che un utente A può dare diritti ad un’entità intermedia B per autenticarsi ad un terzo server C, come se
l’entità B fosse l’utente A stesso. Il server C baserà le sue decisioni autorizzative sull’identità di A invece che su quella di B.

E’ possibile iterare questo schema per più livelli applicativi distribuiti (multi-tier applications) solamente utilizzando Kerberos e non NTLM, semplicemente perchè NTLM non supporta la delegation! Quindi NTLM funziona su un’architettura a single server solo perchè il security context dell’utente viene creato alla sua connessione al primo livello sul server (dopo l’autenticazione) ed è disponibile poi per i livelli applicativi sucessivi.

Nell’implementazione Microsoft di Kerberos, il servizio stesso è altamente integrato con Active Directory (AD) e tutti i dati e le credenziali sono memorizzati in essa

(continua…)

gennaio 10th, 2009 di Mauro Dalfreddo

Chi predica bene razzola male, recita il proverbio. Ho sempre sostenuto l’esigenza di backup frequenti dei dati di business o comunque importanti.

lacie250Custodivo la maggior parte dei dati sul mio buon vecchio (3 anni oramai) LACIE, un disco esterno USB da 250 GB. Solitamente faccio backup frequenti per i files di progetto e le fotografie digitali su DVD-ROM, ma nulla per quanto riguarda i montaggi dei filmati AVI, essendo questi di dimensioni spropositate: 50-60 GB complessivamente tra i files originali scaricati dalla videocamera digitale JVC, il montato, i files di contorno e i files temporanei… D’altronde per backuppare tutto ciò ci vorrebbe un’unità nastro o un altro disco fisso; e poi i tempi di backup non sarebbero proprio istantanei…

tb32-raid1E la perdita dei dati a causa della rottura del disco è per me in generale una cosa tremenda!

 Così, per razzolare bene ed evitare la perdita dei suddetti montaggi video, ho acquistato un’unità esterna che implementasse la tecnologia RAID 1, ovvero la copia real-time dei dati (a livello di byte) tra due dischi. In questo modo, pur rimanendo la problematica del backup, ho aumentato l’integrità dei dati e la tolleranza ai guasti del disco.

Ho acquistato un Mapower TB32, cioè un’unità esterna che espone al Sistema Operativo un unico disco (il mirror), mentre invece internamente ci sono 2 dischi SATA che lavorano in parallelo. La configurazione è semplice e viene effettuata solo in hardware tramite un jumper e lo stato dei  dischi è visualizzato tramite i led sul pannello frontale. Le connessioni esterne sono USB ed eSATA.

La sceneggiatura (alla Bill Maxwell) prevedeva quindi la copia dei dati tra le due unità USB. E la copia di 200 GB  non è una cosa da farsi con Windows Explorer, che è estremamente lento ed in caso di errori si ferma a metà.

Ho utilizzato invece Killcopy, un programma freeware che accellera la copia tra files sfruttando parallellismo e grandi buffer di memoria; inoltre può effettuare una verifica dei bytes scritti (utile nelle copie in rete), riservare lo spazio prima della copia effettiva (per ridurre la frammentazione del file) ed essere utilizzato dalla command line.  Cito brevemente  Teracopy, un altro programma con le stesse caratteristiche, disponibile gratuitamente per usi non commerciali.

E nel bel mezzo della copia massiva, dopo un centinaio di GB copiati,  ecco comparire i primi problemi: errori CRC, dovuti probabilmente a settori danneggiati o illeggibili… Non mi preoccupavo, finché questi comparivano su alcuni file thumb.db o su qualche foto già backuppata; mi sono seriamente preoccupato quando, ad un certo punto è comparso il popup di alert Disco non inizializzato, formattare il disco!
Ovviamente non ho seguito il suggerimento di Windows, e mi sono buttato freneticamente nell’attività di data recovery.

Il disco veniva riconosciuto tra le periferiche rimuovibili, la partizione del disco veniva riconosciuta dal Sistema come RAW, non più come NTFS, e questo significava che si era danneggiata l’area del disco dove risiedeva la MFT, quindi non l’elettronica o le meccaniche del disco.

Tutto sommato la situazione non era cosè catastrofica: quello che mi interessava veramente l’avevo già copiato e poi avevo alcuni backup delle foto e del software sviluppato; non mi ricordavo se mancava ancora qualche file…

Alla fine ho utilizzato GetDataBack for NTFS, un eccellente programma commerciale per il recupero dei dati: di fatto analizza i settori del disco alla ricerca di record e pezzi di directory; poi permette il salvataggio dell’indice così ricostruito su un file, in modo tale da poter accedere velocemente ai dati del disco anche in un secondo momento senza dover ripetere l’analisi. 

Alla fine ritengo di aver recuperato il 99% dei dati presenti sul disco USB, e comunque il 100% di ciò che mi interessava veramente.

Una storia comunque finita bene, anche se mi ha fatto sudare freddo perdendo un po’di tempo durante il week-end, e che mi ha dato ragione sull’importanza delle politiche di backup e salvaguardia dei dati per mezzo della tecnologia Raid.
novembre 6th, 2008 di Mauro Dalfreddo

Recentemente ho avuto la necessità di forzare il cambio utente in un’applicazione asp.net che utilizza Windows Autentication come sistema di autenticazione.

Sharepoint: Accedi come utente diversoL’idea è stata presa dai siti di Micorsoft Office Sharpoint 2007 (MOSS): di default l’accesso viene effettuato con l’utente corrente di dominio; al bisogno è presente un link nel menù per cambiare l’utente connesso; viene presentato quindi il popup standard per l’immissione delle credenziali, dopo la nuova autenticazione l’utente viene ripresentata la pagina corrente…

I requirement erano simili, ovvero l’utente Windows connesso all’applicazione asp.net su IIS non doveva essere necessariamente quello loggato sulla macchina con il CTRL+ALT+CANC. La problematica è connessa anche col fatto che i siti di una intranet sono tutti trusted di default, per cui Explorer effettua tramite la Windows Authentication un’autenticazione implicita (single sign-on). 

I vantaggi del cambiamento di profilo sono palesi: l’utente non deve scollegarsi e riconnettersi a Windows, chiudendo tutte le applicazioni, oppure eseguire Internet Explorer con l’opzione “Run as”; deve solo cliccare un link…

Il trucco sta nello spedire al browser uno status code 401 “Access denied”, per cui il browser richiede all’utente ulteriori credenziali e richiama la pagina nuovamente.

Nella pagina desiderata, o nella master page, inserire il link alla pagina del cambio utente:

<a href="AccessDenied.aspx?loginasanotheruser=true">Cambio profilo</a>

In AccessDenied.aspx  
 

<%@ Page Language="C#" autoeventwireup="true"%>
<%
if (Session.IsNewSession)  Response.Redirect("default.aspx", true);
Session.Abandon();
Response.StatusCode = 401;
Response.StatusDescription = "Access Denied";
%>

Questa pagina controlla se la sessione è appena stata creata, e nel qual caso reinvia l’utente, che si è appena autenticato ad IIS, alla home page. Viceversa viene reimpostato lo status cose a 401. Il client richiede nuovamente le credenziali e la pagina aspx viene eseguita nuovamente solo se queste sono valide (è IIS infatti che effettua questa verifica).

Al posto di redirezionare il client alla home page è possibile ritornare sulla pagina appena precedente; basta passare a AccessDenied.aspx un parametro con il valore di window.location; ma questa è un’altra storia…

maggio 29th, 2008 di Mauro Dalfreddo

Ho sempre piacevolmente apprezzato le implicazioni dell’autenticazione integrata windows e nelle mie applicazioni, a meno che non mi sia esplicitamente richiesto, cerco sempre di portare il contesto di sicurezza dell’utente più avanti possibile nelle sue varie componenti.

Per esempio: il browser viene eseguito nel contesto di sicurezza dell’utente che si logga al computer, poi l’utente si autentica al Web server e le pagine chiamate ed i componenti software che le sottintendono sono eseguiti nel contesto di sicurezza dell’utente stesso. Similmente accade per l’autenticazione e la fruizione di altri servizi di rete o della connessione al database (anche in cascata tramite linked servers).

La seguente figura rappresenta tale scenario.

Authenticatione and Delegation

Dopo aver effettuato un brevissimo e sintetico excursus sui concetti di base, che verranno dati per scontati nei miei prossimi articoli, comincerò a descriverne l’implementazione. Nei prossimi articoli descriverò come implementare questa funzionalità in un ambiente distribuito per mezzo del modello di impersonazione e delega.

(continua…)

maggio 22nd, 2008 di Mauro Dalfreddo

Sempre nell’ambito di una migrazione talvolta è comodo disabilitare temporaneamente i check constraints e le foreign keys relativi alla/e tabelle di un database, per poter effettuare delle operazioni di manutenzione estemporanee o cancellazioni e reinserimenti multipli.

E’ altresì comoda la disabilitazione temporanea quando si deve svuotare (totalmente o parzialmente) una tabella per effettuarne il carico tramite BCP. Dopo aver disabilitato le foreign keys, visto che comunque non è possibile effettuare il truncate (essendo queste ultime ancora presenti sebbene disabilitate), è possibile effettuare le DELETE selettive o sull’intera tabella.  Ovviamente in presenza di milioni di righe nella tabella consiglio di SCRIPTARE i constraints, DROPPARLI, effettuare il TRUNCATE, e RICREARLI.

Se volessimo effettuare la disabilitazione complessiva dei constraints su tutto il DB basterebbe eseguire la seguente stored procedure:

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

e per la riabilitazione:

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

(continua…)

maggio 20th, 2008 di Mauro Dalfreddo

Mi sono dedicato ultimamente alla migrazione di alcuni database da un’istanza di SQL Server 2005 ad un’altra; come spesso succede, mi sono trovato di fronte al tedioso problema del cambiamento di collation, nel caso specifico da SQL_Latin1_General_CP1_CI_AS al Latin1_General_CI_AS. Se si utilizzano le funzionalità di backup e restore del database sulla nuova istanza, purtroppo ci si porta dietro la vecchia collation.

Esistono in internet degli script (ne viene riportato sotto uno stralcio) che modificano la collation degli oggetti contenuti nel DB (tabelle, colonne, viste, ecc.) e infine quella del DB stesso (utilizzando iterativamente dapprima ALTER TABLE tablename ALTER COLUMN columnname COLLATE default, ed infine ALTER DATABASE databasename COLLATE default). Funzionano in casi semplici, ma ci sono seri problemi quando la struttura del DB non è banale, ovvero sono presenti anche oggetti complessi (funzioni, foreign keys, trigger, indici, librerie, ecc. con le relative dipendenze), che devono essere droppati e ricreati.

La soluzione più semplice per migrare un database senza mantenere la collation originale da SERVER1 a SERVER2 è quella che descrivo nel seguito; i passi sono 3:

  1. scriptare il DB (e tutti gli oggetti contenuti) senza generare le collation sulla prima istanza.
  2. eseguire tale script sulla seconda istanza
  3. esportare ed importare i dati di tutte le tabelle con l’utility BCP

I primi due passi sono banali. Per automatizzare il terzo, ho sviluppato il seguente script: in funzione del database MyDatabase scelto, l’obiettivo è quello di generate tutte le istruzioni BCP, una per ogni tabella (nel relativo schema) con i corretti parametri.

use MyDatabase
DECLARE @srv_source varchar(50)
DECLARE @srv_destination varchar(50)
DECLARE @dbname varchar(50)
DECLARE @tmp varchar(max)
SELECT @dbname = db_name(), @tmp =char(13)+char(10),
           @srv_source = 'SERVER1', @srv_destination = 'SERVER2'
select @tmp = @tmp + 'bcp '+@dbname+'.'+schema_name(so.schema_id)+ '.'+so.name +
' out '+so.name+'.dat -c -T -q -S '+ @srv_source + char(13)+char(10) +
'bcp '+@dbname+'.'+schema_name(so.schema_id)+ '.'+so.name +
' in '+so.name+'.dat -c -T -E -q -S '+ @srv_destination + char(13)+char(10)
from sys.objects so where so.type ='U'
SELECT  1 AS TAG, 0 AS PARENT, @tmp
            as [SqlCommand!1!!cdata]
FOR XML
EXPLICIT, xmldata

(continua…)

maggio 20th, 2008 di Mauro Dalfreddo

Posto di seguito un semplice script per effettuare il backup di tutti i database (tranne il tempdb) presenti in un’istanza di SQL Server. L’ho implementato su un’istanza SQL Server 2005 a 64bit, ma funziona anche per le versioni precedenti come SQL2000 e sul nuovissimo SQL2008.

Backuppare i backup in un ambiente di produzione è un esigenza indiscutibile; in questo caso la tipologia di backup prescelta è quella full, che può essere tranquillamente utilizzata per DB di piccole e medie dimensioni, ma che può essere modificata per esigenze diverse. I backup vengono salvati nella cartella C:\BACKUP\SQL\.

Da notare che un backup automatizzato tramite script di tutti i DB presenti sull’istanza minimizza sicuramente l’intervento amministrativo.

DECLARE @dbid int
DECLARE @dbname varchar(100)
DECLARE @sql varchar(1000)
DECLARE curs CURSOR LOCAL FORWARD_ONLY FOR
select database_id, [name] from msdb.sys.databases where name <> ''tempdb''
OPEN curs
FETCH NEXT FROM curs INTO @dbid, @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = ''BACKUP DATABASE [''+@dbname+''] TO 
DISK = N''''C:\BACKUP\SQL\''+@dbname+''.bak''''
WITH NOFORMAT, INIT,  NAME = N''''''+@dbname+''-Full Database Backup'''',
SKIP, NOREWIND, NOUNLOAD,  STATS = 10''
RAISERROR(N''Executing... %s'',2,-1,@sql)
EXEC( @sql )
FETCH NEXT FROM curs INTO @dbid, @dbname
END

(continua…)

ottobre 17th, 2007 di Mauro Dalfreddo

Il PageRank (PR) è un importante valore numerico che rappresenta l’importanza (secondo Google) di una pagina nel Web:

PageRank relies on the uniquely democratic nature of the web by using its vast link structure as an indicator of an individual page’s value. Google interprets a link from page A to page B as a vote, by page A, for page B. But Google looks at more than the sheer volume of votes, or links a page receives; it also analyzes the page that casts the vote. Votes cast by pages that are themselves “important” weigh more heavily and help to make other pages “important.”

Traducendo e parafrasando: una pagina web può essere raggiunta da un certo numero di link (entranti), che risiedono su altri siti o pagine e contenere un certo numero di link (uscenti) che puntano verso altri siti o pagine; di tutti questi link quelli presi in considerazione (per il calcolo del PR) dal nostro Motore di ricerca sono unicamente quelli entranti. E visto che Google da’un peso non solo al numero complessivo di link entranti, ma anche alla qualità (ovvero al PR – sembrerebbe quindi che il PG sia una specie di funzione pseudoricorsiva!!) delle pagine in cui si trovano, si capisce quindi l’importanza dei link provenienti da pagine con valori di PR alto.

La via più semplice per conoscere questo valore numerico (anche se approssimato) è la Google toolbar, ma esistono altri tools e scripts che possono estrarlo. Uno dei più famosi scripts è stato pubblicato su www.googlecommunity.com.

L’agoritmo  può essenzialmente esser suddiviso in due fasi: il calcolo del checksum associato alla pagine web e la request verso Google del valore numerico. 

Qui presento una versione modificata di quello script , facilmente inseribile in qualsiasi progetto: un unico script, che non fa uso di immagini, ma che usa gli stili per una semplice rappresentazione grafica (la classica barretta colorata!).

Script per calcolare il PageRank

Una semplice demo online invece si trova qui

Internet