lundi 30 juillet 2007

Mise en oeuvre d'un test de validité avec SQL Server Integration Services

Bonsoir à tous !

Si SSIS présente de grands avantages en matière de débugging de part sa conception, il n'en demeure pas moins un outil largement perfectible sur un certain nombre de points.

Le premier d'entre eux est sans doute la faiblesse des bibliothèques de fonctions accessibles dans les tâches de conversions de données. En effet, les tests classiques permettant d'identifier la bonne typologie de la donnée importée dans un Data Flow (ISDATE, ISNUMERIC, ...) ne peuvent pas être effectués autrement qu'à l'aide d'une tâche Script Component... Une tâche souvent fastidieuse et longue à développer, en particulier si le nombre de champs à tester est particulièrement important.
Si devant cette lacune importante la solution de redévelopper un composant spécifique pour SSIS vient immédiatement à l'esprit, la réalité du déploiement sur les postes clients nous rattrape inexorablement. En effet, il est nécessaire de déployer le dit composant sur tous les serveurs impactés ce qui peut s'avérer rapidement délicat...

Je viens donc ici vous proposer une solution alternative, bien que peu satisfaisante pour les perfectionnistes dont je fais partie : l'utilisation de tables temporaires !
En effet, si SSIS ne possède pas les fonctions adéquates, le Transact-SQL peut venir à notre secours !
Il convient donc d'intégrer la source de données dans une table temporaire indépendante du format des données - par exemple des champs VARCHAR - puis d'effectuer les transformations et les vérifications d'intégrité dans le cadre d'une procédure stockée...

Si cette solution demeure peu reluisante, elle reste réellement la seule solution viable tant que SQL Server Integration Services n'offrira pas une bibliothèque de composants et de fonctions satifaisante...

A suivre...

Déplacement des bases de données système SQL Server 2005...

Bonjour à tous !!!

Voici un post qui ne devrait pas laisser indifférentes les personnes qui ont procédé au déplacement laborieux de toutes les bases d'une instance SQL, en particulier les bases système !

En effet, si le déplacement de ces bases est largement documenté dans la MSDN, il n'en demeure pas moins extrêmement long et fastidieux d'entreprendre une telle opération...
On note cependant l'effort important que Microsoft a consenti pour simplifier ce déplacement entre la version SQL Server 2000 et SQL Server 2005.

Pour mémoire, vous trouverez ici la documentation concernant le déplacement des fichiers des bases de données système de SQL Server 2000 et de SQL Server 7.
Sous SQL Server 2005, seul le déplacement des bases de données Master et mssqlsystemresource, nouvelle base de données qui n'existait pas sous SQL Server 2000, nécessite un traitement particulier.

Je vous propose donc ici un script customisable qui devrait ravir les grands et les petits qui souhaitent déplacer leurs bases de données système SQL Server 2005 en un clic !

Pour exploiter le code suivant, sauvegardez le dans un fichier Visual Basic Script (par exemple c:\movedb.vbs) et lancez le !

Function newliner(s)
newliner = Replace(s,"\n",VBCrLf)
End Function

Sub commande(s)
shcmd.Run "cmd /C " & s,1,true
End Sub

Dim base(4)
base(0) = array("ma","","","","master.mdf","mastlog.ldf")
base(1) = array("rs","mssqlsystemresource","data","log","mssqlsystemresource.mdf","mssqlsystemresource.ldf")
base(2) = array("mo","model","modeldev","modellog","model.mdf","modellog.ldf")
base(3) = array("db","msdb","MSDBData","MSDBLog","MSDBData.mdf","MSDBLog.ldf")
base(4) = array("tp","tempdb","tempdev","templog","tempdb.mdf","templog.ldf")

Function baseray(s)
baseray = array()
For Each row in base
If row(0) = s Then
baseray = row
End If
Next
End Function

' Déplace une base de données autre que "master" et "resource"
Sub movenormal(row, s)
database = row(1)
If s = "d" Then
nom = row(2)
fichier = row(4)
Elseif s = "j" Then
nom = row(3)
fichier = row(5)
End If
commande("sqlcmd -S " & instance & " -Q ""ALTER DATABASE " & database & " MODIFY FILE (name=" & nom & ", FILENAME='" & dest & "\" & fichier & "')""")
commande("net stop " & serviceinstance & " /yes")
commande("move """ & src & "\" & fichier & """ """ & dest & """ ")
commande("net start " & serviceinstance)
End Sub

' Déplace "master" et "resource"
Sub movemaster()
row = base(0)
fichierd = row(4)
fichierj = row(5)
commande("net stop " & serviceinstance & " /yes")

'SEARCH and replace parameters
cle = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL\" & keyinstance
cleinstance = shcmd.RegRead(cle)
cle = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\" & cleinstance & "\MSSQLServer\Parameters"
If s = "d" Then
shcmd.RegWrite cle & "\SQLArg0", "-d" & dest & "\" + fichierd, "REG_SZ"
commande("move """ & src & "\" & fichierd & """ """ & dest & """ ")
Elseif s = "j" Then
shcmd.RegWrite cle & "\SQLArg2", "-l" & dest & "\" + fichierj, "REG_SZ"
commande("move """ & src & "\" + fichierj & """ """ & dest & """ ")
End If
commande("net start " + serviceinstance + " /f /T3608")
row = base(1)
database = row(1)
nomd = row(2)
nomj = row(3)
fichierd = row(4)
fichierj = row(5)
If s = "d" Then
commande("sqlcmd -S " & instance & " -Q ""ALTER DATABASE " & database & " MODIFY FILE (name=" & nomd & ", FILENAME='" & dest & "\" & fichierd & "')""")
commande("move """ & src & "\" & fichierd & """ """ & dest & """ ")
Elseif s = "j" Then
commande("sqlcmd -S " & instance & " -Q ""ALTER DATABASE " & database & " MODIFY FILE (name=" & nomj & ", FILENAME='" & dest & "\" & fichierj & "')""")
commande("move """ & src & "\" & fichierj & """ """ & dest & """ ")
End If
commande("sqlcmd -S " & instance & " -Q ""ALTER DATABASE " & database & " SET READ_ONLY""")
commande("net stop " & serviceinstance & " /yes")
commande("net start " & serviceinstance)
End Sub

set shcmd = WScript.CreateObject("WScript.Shell")

' Variables à redéfinir par InputBox ou manuellement:
' nom du serveur SQL et de l'instance dont on déplace les basese
serveur = InputBox("Nom du serveur")
If serveur = "" Then WScript.Quit
instance = InputBox("Nom de l'instance (Pour l'instance par défaut, laisser le champ vide)")
If Replace(instance, " ", "") = "" Then
instance = serveur
serviceinstance = "MSSQLSERVER"
keyinstance = "MSSQLSERVER"
Else
instance = serveur & "\" & instance
serviceinstance = "MSSQL$" & instance
keyinstance = instance
End If

src = InputBox("Chemin source")
dest = InputBox("Chemin destination")

line = "Base(s) à déplacer:\nmr: master + resource\ndb: msdbdata\nmo: model\ntp: tempdb\n(ex: 'mr, tp')"
db = InputBox(newliner(line))

line = "Déplacer (d)onnées, (j)ournaux\n ou les deux (d,j)"
dj = InputBox(newliner(line))

'line = "Paramêtres:\n- source: " + src + "\n- destination: " + dest + "\n- bases: " + db + "\n- objets: " + dj
'msgbox(newliner(line))

dbpar = Split(Replace(db," ",""),",")
djpar = Split(Replace(dj," ",""),",")

For Each db In dbpar
If db <> "mr" Then
r = baseray(db)
If ubound(r) > -1 Then
For Each dj in djpar
movenormal r, dj
Next
End If
Else
movemaster
End If
Next


Bonne journée !