Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Divers : Maintenant c’est 14$ pour voyager aux USA

Celles et ceux qui ont l'occasion de se rendre aux USA, auront le plaisir de payer 14$. Ceci est valable pour les personnes exemptées de Visa (Visa Waiver) qui couvre les nationaux français et une bonne partie des européens.

La bonne nouvelle ce que ce paiement ne se ferait qu'à l'inscription sur le site ESTA (http://esta.cbp.dhs.gov) et à partir du 8 septembre 2010 uniquement.

Je ne saurai que encourager les personnes n'ayant pas encore cette autorisation électronique de la demander maintenant (elle est valable 2 ans) et ceux en possédant une de la renouveler avant le 8 septembre (si c'est possible, coup de bol la mienne expire ce mois ci) !

Source : http://photos.state.gov/libraries/france/5/pressreleases/pr20100810f.pdf

Bonne nouvelle ?

Posté le par christian | 4 commentaire(s)

SQL Server : Sortie du driver PHP pour SQL Server version 2.0 avec support du PDO

C'est tout frais d'aujourd'hui, le nouveau driver PHP pour SQL Server est sorti en version finale. Côté PHP on a le support natif la partie PDO et côté SQL Server le support de SQL Azure ce qui devrait permettre de jolis applications PHP « on the cloud ».

L'info :

http://blogs.msdn.com/b/sqlphp/archive/2010/08/04/microsoft-drivers-for-php-for-sql-server-2-0-released.aspx

Pour le téléchargement, c'est ici :

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=80e44913-24b4-4113-8807-caae6cf2ca05

Bon téléchargement...

Posté le par christian | 0 commentaire(s)

SQL Server : Licences et environnements de développement, test et pré-production ?

Ces derniers temps je tombe sur beaucoup de scénarios clients concernant les environnements de développement, de test ou de pré-production. Faut-il acheter des licences pour ces serveurs et si oui lesquels ?

La réponse est « oui il faut acheter des licences », mais dépend des licences existantes dont vous disposez :

  • Tous vos développeurs travaillant sur ces environnements ont une licence MSDN.
    • Dans ce cas pas de licences supplémentaires à acquérir pour ces environnements, les licences MSDN couvrant effectivement ces scénarios d'utilisation et cela pour tous les produits Microsoft, la règle étant d'avoir une licence MSDN par développeur.
  • Vous n'avez pas de licence MSDN ou tous les développeurs n'en ont pas (et n'en ont pas besoin).
    • La solution dans le cas présent et l'édition Developer de SQL Server, qui pour un cout d'environ 40 à 50 € permet à un utilisateur d'utiliser ces environnements. Attention la licence de SQL Server Developer Edition n'est valable que vous ces environnements et est valable pour une personne.

Vous l'aurez compris, dans le cas de développement exclusif de projet de bases de données et / ou de Business Intelligence, l'édition Developer (à défaut d'abonnement MSDN) est très intéressante et évite de passer par des solutions plus couteuses pour un usage hors de la production et à un coût particulièrement intéressant.

C'était la minute licensing du jour ;o)

Bon tests…

Posté le par christian | 3 commentaire(s)

SQL Server : Quand ré-exécuter une requête coté applicatif

Voici une liste de messages (non limitative) qui lorsqu'ils sont rencontrés il est utile de ré exécuter la transaction ou la requête ayant échouée.

 

  • Message d'erreur 1222
    • Lock request time out period exceeded.
    • Délai de requête de verrou dépassé.

Ce message ne se produira que si vous avez l'option SET LOCK_TIMEOUT définie dans votre connexion. Celle-ci permet d'abandonner l'acquisition d'un verrou si elle dure plus que le nombre de millisecondes spécifiés. Utile si vous ne voulez pas être bloqué par un processus et être notifié dans l'application et au besoin réessayer plus tard la même requête. Par contre si le serveur est très chargé il n'y aucune garantie que la réexécution de la requête ultérieurement puisse se faire.

 

  • Message d'erreur 1205
    • Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
    • La transaction (ID de processus %1!) a été bloquée sur les ressources %2! par un autre processus et a été choisie comme victime. Ré-exécutez la transaction.

    Un message classique qui concerne les Deadlocks (inter blocable). SQL Server détecte 2 processus ou plus étant bloqués les uns par les autres, un ou plusieurs de ces processus doit être arrêté par SQL Server pour débloquer les autres. Ce cas est classique et les causes sont nombreuses, peut savent que pour résoudre « « temporairement » le problème, une simple réexécution de la même requêtes quelques secondes plus tard suffit (et on logue la requête pour investiguer par la suite).

  • Message d'erreur 3960
    • Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table '%.*ls' directly or indirectly in database '%.*ls' to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement.
    • La transaction d'isolement d'instantané a été abandonnée en raison d'un conflit de mise à jour. Vous ne pouvez pas utiliser l'isolement d'instantané pour accéder à la table '%1!' directement ou indirectement dans la base de données '%2!' afin de mettre à jour, de supprimer ou d'insérer la ligne modifiée ou supprimée par une autre transaction. Réexécutez la transaction ou changez le niveau d'isolement pour l'instruction de mise à jour/suppression.

Dans le cas d'une transaction se déroulant dans la niveau d'isolation READ COMMITTED SNAPSHOT (nouveau sous SQL Server 2005), cette erreur se produire si une autre transaction a modifié les données que vous souhaitez vous-même mettre à jour. Attention comme ce niveau d'isolation s'active pour toutes les transactions dans une base de données et remplace le READ COMMITTED simple, toute modification de données est susceptible de tomber sur ce message.

Une bonne pratique dans une application sera d'avoir une boucle qui à la suite de la rencontre d'une des erreurs mentionnées précédemment réessayera la même requête, avec un temps d'attente entre chaque boucle. Par exemple, 5 tentative avec 1 seconde d'attente entre chaque. A ce système il serait aussi intéressant de loguer systématiquement les requêtes engendrant des erreurs côté serveur, il est en effet pas très aisé de retrouver l'erreur et les requête impliqué directement depuis SQL Server, l'application ne que mieux faire !

Comme indiqué au début cette liste est non limitative, mais reprend des cas courant .

Bonne exécution…

Posté le par christian | 0 commentaire(s)

SQL Server : Sauvegarder ses bases de données vers un fichier horodaté et vérifier les sauvegarde automatiquement

Pour commencer la semaine, voici un script d'automatisation de sauvegarde, qui vous permet d'un part d'intégrer la date à vos fichiers de sauvegarde et d'autre part de lancer la vérification de celle-ci en se basant sur un calcul de CHECKSUM.

Dans ce genre de cas, une logique à base de curseur est de loin ce qui se fait de plus simple, on exécute la commande BACKUP DATABASE dans cette boucle en lui passant 2 variables, l'une correspondant au nom de la base de données, l'autre au nom du fichier cible.

J'utilise une nouveauté de SQL Server 2005, qui consiste dans le calcul d'un CHECKSUM pour permettre la vérification de l'intégrité du fichier de sauvegarde (ne pas confondre avec le CHECKSUM intégré dans les pages au sein de SQL Server) et à la suite de la sauvegarde la commande de vérification (RESTORE VERIFYONLY) qui n'est pas nouvelle, mais intègre l'option de CHECKSUM elle aussi.

Libre à vous d'y ajouter des blocs TRY / CATCH si nécessaire et aussi de mettre un DBCC CHECKDB avant la sauvegarde pour assurer l'intégrité logique de la base de données. On pourra aussi paralléliser un peu plus l'exécution en réalisant le CHECKDB d'une base pendant le BACKUP d'une autre et le VERIFY d'une autre encore. Mais là ça devient compliqué.

Le script :

DECLARE @path nvarchar(4000) ;
DECLARE @dbid int, @dbname sysname ;
DECLARE @filename nvarchar(max) ;

SET @path =
'C:\BACKUP\' ;

DECLARE crsDB CURSOR FOR SELECT database_id, name FROM sys.databases WHERE name != 'tempdb' FOR READ ONLY ;

OPEN crsDB ;

FETCH NEXT FROM crsDB INTO @dbid, @dbname ;


WHILE ( @@FETCH_STATUS = 0)

BEGIN


    SET @filename = @path + CASE WHEN RIGHT(@path, 1) != N'\' THEN N'\' ELSE N'' END + @dbname + CONVERT(nvarchar(20),GETDATE(), 112) + '.BAK';

BACKUP DATABASE @dbname TO DISK = @filename WITH CHECKSUM;
RESTORE VERIFYONLY FROM DISK = @filename WITH CHECKSUM
;

FETCH NEXT FROM crsDB INTO @dbid, @dbname ;


END


CLOSE crsDB ;

DEALLOCATE crsDB ;

Dernière chose pour déterminer l'emplacement par défaut au SQL Server dépose ses sauvegarde :

-- Récupère l'emplacement par défaut des sauvegardes

DECLARE @regpath nvarchar(4000);
DECLARE @instancename nvarchar(128), @regvalue nvarchar(1000);

-- Détermine le nom de l'instance
SELECT @instancename = CAST(CASE WHEN SERVERPROPERTY('InstanceName') IS NULL THEN 'MSSQLSERVER' ELSE serverproperty('InstanceName') END as nvarchar(128))

SET @regpath =
'Software\Microsoft\Microsoft SQL Server\Instance Names\SQL' ;

EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE',
@key=@regpath,
@value_name=@instancename,
@value=@regvalue OUTPUT

SET
@regpath =
'Software\Microsoft\Microsoft SQL Server\' + @regvalue
+
'\MSSQLServer' ;

-- Trouve le chemin d'installation
EXEC master..xp_regread @rootkey='HKEY_LOCAL_MACHINE',
@key=@regpath,
@value_name='BackupDirectory',
@value=@regvalue OUTPUT

SET
@path =
@regvalue
;

Ce dernier script peut être inséré dans la suite de la déclaration de variable du code de sauvegarde.

Bonne sauvegarde…

Posté le par christian | 0 commentaire(s)

SQL Server 2008 : Service Pack 2 en Beta et téléchargement publique

La première CTP du Service Pack 2 de SQL Server 2008. Ce Service Pack attendu pour ce trimestre, regroupe une bonne partie des corrections sorties sous forme de Cumulative Update et y apporte des tests approfondies (moins de risques de régression que les Cumulative Update). Pas d'ajout de fonctionnalités dans celui-ci excepté les éléments nécessaires au support de SQL Server 2008 R2.

C'est ici :

http://www.microsoft.com/downloads/details.aspx?FamilyID=65606fdd-093f-4c70-91f6-dc1f24520e8f&displaylang=en&displaylang=en

C'est une Beta, si vous constatez des bugs, merci de les signaler sur le site Connect :

http://connect.microsoft.com/SQLServer/

En attendant la version finale !

Bon téléchargement…

SQL Server : Migrer vos compétences d’Oracle vers SQL Server les 28 et 29 juin via un LiveMeeting gratuit

Microsoft propose en ligne une présentation de 2 jours en anglais sur la migration de compétence Oracle vers SQL Server.

Pour s'inscrire c'est ici : https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032454219&Culture=en-US

C'est une conférence en ligne qui promet d'être suivie. Je pense que le décalage horaire sera bénéfique à ceux voulant suivre le sujet après leur travail :o)

Si vous connaissez Oracle et n'êtes pas trop rebutés par l'anglais n'hésitez pas et faites passer !

Bonne formation…

Posté le par christian | 0 commentaire(s)

SQL Server : Un exemple pratique, trouver le pays d’un utilisateur par son IP (2 sur 3)

Dans cette seconde partie nous allons faire un usage intensif de SQL Server Integration Services (SSIS). On pourrait intégrer les données de bien d'autres manières, mais le fait est que les fichiers sources n'ont pas un format très standard pour les sources de données fichiers plats à la sauce Microsoft et que j'ai besoin de transformer les IP des fichiers en données binaires pour plus tard.

D'autre part SSIS, permet nativement la connexion sur un serveur FTP ce qui va nous servir à télécharger les fichiers source avant de les intégrer.

Etape 1 : Charger les fichiers sources via FTP

Cette étape est assez simple, on a une tâche FTP par fichier chargé, ces 5 tâches se partagent la même source. La conséquence de ce partage de connexion, est que l'on ne peut pas les exécuter simultanément… Les temps de téléchargement sont court, çà ne devrait pas poser de problèmes.

 

Etape 2 : Sélection des lignes de données

Pour cette opération, étant donné que les données n'ont pas un nombre uniforme de colonne sur chaque ligne, vous aurez généralement 2 choix pour traiter la source.

La première solution consiste à mettre une source de fichier plat avec une colonne unique et de l'éclater via une transformation en script (.net). Personnellement je n'aime pas trop cette méthode, car assez peu souple et elle souffre du manque de possibilité de débogage de .Net au sein de SSIS.

La seconde solution repose sur un pré-découpage des fichiers. Généralement on prend un fichier plat on définit une ou 2 colonnes sources, et on effectue un split sur la valeur de ces colonnes. Enfin on remet le tout dans un fichier plat qui sera traité par la suite. L'intérêt de la solution d'utiliser les tâches standard de SSIS, on pourra dire que c'est un peu plus lent, certes, mais le temps de traitement qui se fait intégralement en mémoire est assez rapide ! D'autre part on pourra on passant intégrer les 5 fichiers sources en 1 seul (boucle for each).

 

Etape 3 : Intégration avec conversion des données binaires

Dernière étape, on lit notre unique fichier source en réalisant au passage quelques conversions et on pousse le résultat dans la ou les tables SQL Server de destination.

Ici le choix des conversions s'est porté sur .Net, côté SQL Server l'appel d'une fonction scalaire, qui plus est, écrite en T-SQL serait assez inefficace. De plus côté .Net il y a une classe qui réalise la conversion des IPv4 et IPv6 de manière très efficace, sans plus de code… Autant en profiter !

 

Au niveau des tables, la destination peut être de 2 types : SQL Server ou OLEDB (je passe volontairement sur les autres).

  • Le type SQL Server, permet de mettre en œuvre le chargement en bloc (qui permet de limiter l'impact sur le journal de transaction en fonction du mode récupération de la base de données). Mais ce type de destination nécessite d'être administrateur local de la machine sur laquelle s'exécute SSIS. Cette limitation assez stricte fait que ce type de destination est rarement utilisable. En cas d'erreur sur le chargement la seule actions que vous pouvez prendre et le nombre maximum de lignes en erreur que vous acceptez.
  • Côté OLEDB, ce type de limitation n'est pas présent, mais du coup adieu au chargement en bloc (sauf en magouillant avec le table lock et un traceflag sur le serveur). Ce type permet aussi de récupérer les erreurs de chargement dans la destination (erreurs liées à la présence de contraintes, etc.) et de pourquoi pas les charger dans une table de log.

Dans le cas présent le risque d'erreur est quasi inexistant dans l'insertion et je fais des tests locaux, donc pas de soucis. Dans votre environnement n'hésitez pas à changer les destinations, la structure de table restant la même.

Dernier point je réalise un autre split à partir de la source, je cherche à isoler les IPv6 et IPv4 dans des flux séparés.

Le package

Rien de bien compliquer pour paramétrer ce fichier DTSX, généralement j'ai l'habitude de mettre toutes les répertoires de travail de SSIS dans des variables. Vous n'avez qu'à les modifier avec vos propre valeurs et à modifier la source de données

Le package SSIS (dtsx) est joint à ce billet. Attention il n'est pas parfait, je ne prétends pas être un expert SSIS.

La suite

Ce qui reste à faire, est de loin la partie la plus compliqué, car maintenant il faut requêter la table qui contient la localisation des IP…

Soit la table de la dernière fois:

  http://blogs.codes-sources.com/christian/archive/2010/06/10/sql-server-un-exemple-pratique-trouver-le-pays-d-un-utilisateur-par-son-ip-1-sur-3.aspx

Et les 2 types de requêtes que je peux vouloir faire :

  • Déterminer le pays, d'une IP par exemple au travers d'une fonction scalaire
  • Mettre à jour une table existante avec les IP de login avec leur pays respectifs

De quels index je vais avoir besoin et comment dois-je écrire mes requêtes ?

Bon chargement…

Posté le par christian | 0 commentaire(s)
Attachment(s): Package.zip

SQL Server Azure : Nouvelles tailles de bases de données disponibles

Vous pourrez à partir du 28 juin avoir des bases de données de 1 Go à 5 Go par tranche de 1 Go et pour l'offre Business des bases de données de 10 Go à 50 Go par tranche de 10 Go sur SQL Server Azure

Ces options sont bien entendu payantes, il vous en coutera environ 10$ par Go supplémentaire de stockage, dans les bases de données « business » de 10 Go à 50 Go, environ 100$ les 10 Go de plus.

Une base de 50 Go vous coutera 499,95 $ d'option par mois par exemple. Une base de données de 5 Go sera à 49,95 $ par mois.

Le tableau de prix de l'offre Azure remis à jour :
http://www.microsoft.com/windowsazure/offers/popup.aspx?lang=fr&locale=en-US&offer=COMPARE_PUBLIC

Bonne nouvelle…

Posté le par christian | 0 commentaire(s)

SQL Server v11 alias Denali : Une Beta / CTP bientôt dans les bacs ?

Alors que de manière informelle le nom de de code la prochaine version de SQL Server (qui pourrait sortir l'année prochaine) avait fuité de chez Microsoft, voilà réapparaitre plusieurs références à une CTP 1 de ce même moteur.

Bref nous ne serions pas loin des premières bêta (publique ?) de cette nouvelle mouture de SQL Server qui semble très prometteuse côté moteur relationnel.

Voici les quelques une de ces références :

http://connect.microsoft.com/SQLServer/feedback/details/489789/starting-sql-server-from-command-line-with-incorrect-instance-name-gives-empy-error-message

ou

http://msdn.microsoft.com/en-us/library/ee320880.aspx

Pour le moment pas de communication officielle de la part de Microsoft sur le sujet, seuls quelques gros indices sur la Beta de cette version 11 de SQL Server connue sous le nom de code Denali !

Bonne attente...

Posté le par christian | 0 commentaire(s)
Classé sous :

SQL Server : Un exemple pratique, trouver le pays d’un utilisateur par son IP (1 sur 3)

Voici un exemple intéressant, car complexe à plusieurs titres :

  • Les sources sont « compliquées » à trouver et pas forcément formatées de manière standard
  • Les données sont changeantes et doivent être rafraîchies, et le process d'alimentation doit en tenir compte
  • C'est assez compliqué à requêter

C'est pourquoi je vous propose en 3 parties de passer ces différents sujets.

Une adresse IP (v4 pour rester simple, même si comme on le verra passer en IP v6 sera très simple) est une succession de nombre qui représente votre adresse « unique » sur Internet. Unique pas vraiment pour tous les cas, car il y a tout un tas d'exception, mais pour ce qui concerne les adresses publiques c'est très certainement le cas.

En effet pour s'assurer de cette unicité des organismes sont chargés de la distribution de ces adresses IP. Elles ont été distribuées grossièrement à quelques très grosses entreprises, puis par continents. Chaque zone est chargée de l'enregistrement et de la distribution de ces plages d'adresses.

Comment peut-on connaître la localisation de l'adresse ?

C'est assez simple, les organes d'enregistrement de ces adresses tiennent des bases de données, avec les plages d'IP, les entreprises les ayant demandés et la zone géographique concernée. Même s'il est possible d'aller au détail de la localisation, nous nous arrêterons au pays. L'une des raisons à cela est que les bases de données de ces organes ne sont pas homogènes sur les formats de données.

Où trouver l'information ?

Ces informations ont les trouve via les serveurs Whois. On pourrait alors interroger les serveurs Whois directement. Oui, mais si on se place du côté serveur on n'aura pas forcément toujours une connexion à Internet et imaginez si un million d'adresse à traiter, le trafic réseau que cela va engendrer (et j'ai toutes les chances de me faire bannir du service en passant !).

L'idée est de constituer une table locale contenant ces informations (IP, Pays). Mais le problème c'est que ces données sont changeantes et que les modifications ont lieues tous les jours. Donc il va falloir gérer le rafraichissement de ces données !

Maintenant où va-t-on trouver ces informations sans passer par les Whois ? Eh bien tout simplement par les sources de données de ces Whois, ou plutôt une synthèse de ces derniers. Nous aurons besoins des sources des principales zones géographiques, c'est-à-dire :

  • Ripencc : Europe (je crois)
  • Apnic : Asie / Pacifique
  • Lacnic : Amérique Latine/ Caraïbes
  • Afrinic : Afrique
  • Arin : Amérique du Nord

Cette liste devrait combler plus de 99% de nos besoins. Pour les puristes, il existe d'autres organismes qui gèrent certaines plages d'IP originalement attribués à des grosses entreprise, donc à vous de chercher le 1% restant !

Maintenant au niveau des fichiers sources, ces organismes se copies leurs données à des fins de redondance. On a alors plus qu'à se connecter chez l'un d'entre eux en FTP pour récupérer les fichiers qui nous intéressent :

  • ftp.ripe.net
    • /pub/stats/ripencc/delegated-ripencc-latest
    • /pub/stats/apnic/delegated-apnic-latest
    • /pub/stats/lacnic/delegated-lacnic-latest
    • /pub/stats/arin/delegated-arin-latest
    • /pub/stats/afrinic/delegated-afrinic-latest

Les sources…

Dans ces fichiers la structure est la suivante :

On a des lignes de commentaires précédées de #

A la suite on a 4 lignes d'en-tête qui contiennent la date de modification des données, le nombre de ligne par type d'information présentes dans le fichier.

Pour les données proprement dites, séparées par le symbole « | » et la ligne terminé par un simple LF.

Pour les colonnes cela donne :

  • Nom de l'organisme (Texte)
  • Code pays ISO sur 2 lettres (Texte)
  • Type d'info : asn, ipv4, ipv6 (Texte)
  • Valeur, pour l'adresse de début de la plage (Texte)
  • Range, pour l'adresse IP le masque qui sert à déterminer la taille de la plage d'adresse (Entier)
  • Date d'attribution : AAAAMMJJ (Texte)
  • Status (Texte)

Le principal problème avec ces fichiers c'est l'entête qui peut être d'une longueur variable et les premières lignes qui ne contiennent pas un même nombre de colonnes.

… La destination

Dans quoi va-t-on ranger ces données ? La structure de la table sera assez simple… On a une IP dont on doit vérifier qu'elle est située entre 2 bornes (déduit par le couple IP + Range/Masque), et on le pays… En option je rajouterais la date de création de la zone, mais ça n'est pas obligatoire.

L'IP est un nombre de 4 octets. Ceci tient sans problèmes dans une colonne de type int, certes ce n'est pas la représentation la plus lisible, mais c''est de loin la plus efficace. En effet ils nous faudra être capable de trier sur ces colonnes (eh oui les index ne sont pas loin) et de plus cela limite la taille de la table à son minimum.

On aura alors :

CREATE TABLE dbo.IPv4(

    Country char(2) NOT NULL,

    IpDate date NULL,

    IPStart int NOT NULL,

    IPEnd int NOT NULL

)

 

Notez que je suis sous SQL Server, j'ai donc le type date, sous une version précédente, vous pouvez prendre un smalldate qui aura une plage de date plus que suffisante pour notre cas.

Voilà pour cette première partie, dans la suivante on va se charger de créer un lot SSIS pour intégrer ces données dans notre table.

Bon chargement…

Posté le par christian | 4 commentaire(s)
Classé sous : ,

SQL Server 2008 R2 : Des régressions sur la License et les Prix ?

Là où généralement on découvre avec joie les nouvelles versions de SQL Server (en tout cas moi), SQL Server 2008 R2 n'a pas fait exception, sauf peut-être sur 1 point. En effet j'aurais habituellement tendance à conseiller de passer à la dernière version de SQL Server disponible lors du démarrage d'un projet.

Mais pour cette version je modère un peu cette règle et cela pour 2 raisons :

Le prix

De rapides calculs montrent des augmentations de prix de l'ordre de 10 à 28% pour SQL Server 2008 R2 par rapport à SQL Server 2008. C'est visiblement l'édition Enterprise qui voient le plus son prix augmenter.

C'est une augmentation loin d'être négligeable à laquelle on pourrait rajouter l'obligation de passer à des licences processeur pour les éditions DataCenter et Parallel Datawarehouse, qui peut dans certains scénarios augmenter significativement le coût d'une infrastructure interne à base de SQL Server (surtout dans le cas où tous les utilisateurs ont déjà leur CAL SQL).

Les changements de licensing dans l'édition Standard et Enterprise

Dans le cas de l'édition Standard c'est là que les changements risquent le plus d'impacter les clients, en effet cette édition voit la taille limite de mémoire supportée, passer de « illimité » à 64Go. C'est d'autant plus étonnant que sa copie conforme pour le Web (Web Edition), n'aurait pas cette restriction !

Les changements ne s'arrêtent pas là, car du côté de l'édition Enterprise ils sont aussi nombreux… La virtualisation illimitée disparait purement et simplement de cette édition pour une virtualisation illimitée de SQL Server et Windows il vous faudra le couple Datacenter pour ces 2 produits. De plus le support « illimité » de CPU disparait (notez que implicitement le nombre maximum de cœurs (HyperThreading compris) supportés a été de 64, limite provenant soit disant de l'OS (alors pourquoi cette limite reste sur un couple SQL 2008 + Windows 2008 R2 ????)), au profit d'un nombre maximal de 8 CPU. Côté mémoire aussi apparait une limite de 2To. Si vous souhaitez passer outre ces limites il vous faudra investir dans la couteuse édition DataCenter et son licensing par CPU !

Edit du 14.06.2010 : Le support de la virtualisation illimitée reste possible pour les détenteurs d'une Software Assurance sous SQL Server Edition Enterprise et cela jusqu'à la prochaine version majeure de SQL Server (l'année prochaine ?).

Dernier point totalement incompréhensible sur la gestion multi-instance, celle-ci est limité à 25 instances dans l'édition Enterprise et illimité en Datacenter… Et absente de l'édition Standard. Regardons sous SQL Server 2008, des fonctions équivalentes (certes sans les améliorations de la R2, mais ils tout à fait possible d'y faire des choses très similaires, le socle étant présent) toutes les éditions en profitent (sauf Express faute d'agent) et sans restrictions de nombre !

Je rajouterai à cette liste, un point sur lequel je me suis bataillé (en vain) : Powerpivot. Le licensing de ce dernier fait le grand écart. En effet l'AddOn est gratuit dès lors que vous avez une licence Excel 2010. Mais côté serveur il vous faudra pour en exploiter tout le potentiel, ni plus ni moins que Sharepoint 2010 Enterprise avec SQL Server 2008 R2 Enterprise (ou Datacenter si vous préférez payer plus ;o)). Entre les 2, rien ! Remarquez que rien ne vous empêche de vous envoyer les classeurs PowerPivot par email ou de les stocker dans Sharepoint comme un fichier normal !

Des points positifs ?

A noter côté SQL Server Express le passage de la taille limite des bases de données de 4Go à 10Go et l'apparition de la compression des sauvegardes dès l'édition Standard.

Côté édition Enterprise, la compression des types Unicode est une très grosse nouveauté qui à elle seule pourrait justifier l'intérêt de 2008 R2, tout comme le support du RBS pour un SharePoint 2010 !

Edit du 14.06.2010 : un petit ajout trouvé dans le contrat de licence, le droit d'installer une édition inférieure à celle dont on a acquis la licence apparaît alors que cela n'était pas autorisé auparavant.

En conclusion…

Comme je le disais plus haut j'ai été refroidi par ces «améliorations » du licencing, c'est la première fois en 10 ans que Microsoft réalise une régression dans son Licensing sur SQL Server. Mon interrogation vient aussi du constat que côté moteur relationnel, 2008 R2 est une version « mineure » et changer les choses de cette manière est franchement étonant ! Certes les nouveautés côte BI (décisionnel) sont nombreuses, mais pour les clients non concernés la facture est tout de même chère !

Mon conseil, ne passez pas à 2008 R2 si vous n'avez pas de Software Assurance et bien analysé les modifications de Licensing avant ! Après si vous souhaitez faire un upgrade, celui-ci semble intéressant dans quelques « rares » cas : support de plus de 64 cœurs, compression des types Unicode, RBS, nouvelle version de Reporting Services et Powerpivot. Pour les autres la facture me semble bien chère…

Une référence :
http://download.microsoft.com/download/2/7/0/270B6380-8B38-4268-8AD0-F480A139AB19/SQL2008R2_LicensingQuickReference-updated.pdf

Upgrader ou ne pas upgrader ?

SQL Server : Enfin un driver PDO, disponible en CTP

Une bonne nouvelle n'arrivant jamais seule, après la RTM de SQL Server 2008 R2, voici venir un driver PDO pour SQL Server… Qui ravira la plupart des développeurs PHP désireux d'utiliser SQL Server comme moteur de base de données.

Pour le moment en Beta, il est disponible en téléchargement ici :

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=df4d9cc9-459c-4d75-a503-ae3fceb85860

Il ne resterait plus qu'un driver Unix & Linux pour SQL Server et ce serait un pur bonheur… Rêve ou réalité ?

Bon téléchargement…

Posté le par christian | 0 commentaire(s)

SQL Server 2008 R2 : RTM et téléchargement gratuit de l’édition Express

La version finale de SQL Server 2008 R2 vient d'arriver.

Le téléchargement de l'édition Express :

Version Advanced

http://www.microsoft.com/downloads/details.aspx?FamilyID=e08766ce-fc9d-448f-9e98-fe84ad61f135

Version Express seule :

http://www.microsoft.com/downloads/details.aspx?FamilyID=8b3695d9-415e-41f0-a079-25ab0412424b

Version avec outils de Management :

http://www.microsoft.com/downloads/details.aspx?FamilyID=967225eb-207b-4950-91df-eeb5f35a80ee

Pour le moment pas de nouvelle des autres éditions en téléchargement MSDN ou TechNet mais cela ne devrait pas tarder, sans doute pour se synchroniser avec les la disponibilité des téléchargements d'Office 2010.

Bon téléchargement…

Posté le par christian | 0 commentaire(s)

SQL Server : Vérifier l’intégrité de toutes les bases de données d’un serveur

Aujourd'hui un petit script rapide qui peut vous être utile. Il permet l'exécution de la commande CHECKDB sur toutes les bases de données marquées En Ligne d'une instance.

On fait tout simplement un curseur qui itère sur ces bases de données, et une exécution de code dynamique pour le passage du CHECKDB. En passant on vire les messages informatifs qui ont tendance à polluer les journaux de l'agent.

DECLARE @db_name sysname;
DECLARE @sql nvarchar(max);
SET @sql =
N'';

DECLARE crs_database CURSOR FOR
    SELECT name FROM sys.databases WHERE state = 0;

OPEN crs_database;

FETCH NEXT FROM crs_database INTO @db_name;

WHILE(@@FETCH_STATUS = 0)
BEGIN
    

    SET @sql =
N'DBCC CHECKDB(' + QUOTENAME(@db_name) + N') WITH NO_INFOMSGS';
    

    EXEC(@sql);
    

    FETCH NEXT FROM crs_database INTO @db_name;

END

CLOSE
crs_database;
DEALLOCATE crs_database;

Bonne vérification de vos bases de données…

Posté le par christian | 0 commentaire(s)

SQL Server : Query Notification ou comment être notifié de modifications de données côté application (SqlDependency)

Cette fonctionnalité à vue le jour dans Ado.Net 2.0 et s'appuie sur SQL Server 2005 (et plus) même si elle fonctionne avec SQL Server 2000. Le principe de fonctionnement côté applicatif est assez simple, on fournit une requête et lorsque le résultat de celle-ci change on souhaite être notifié par l'appel d'une fonction (callback).

Ce que vous connaissez peut être moins c'est comment fonctionne ce système. Il repose, sous SQL Server 2005, sur le Service Broker et un système de notification basé sur les vues indexées. Sur SQL Server 2000, c'est un système de pooling d'une table alimentée par des triggers.


  

Dans les 2 cas vous aurez 2 connexions ouvertes vers la base de données. La première sert à créer la notification et malheureusement nécessite des privilèges important (de création d'objet dans la base de données, et de certains privilèges serveurs sous SQL Server 2005). Le seconde sert à la notification et ne nécessite peu de privilèges, mais vous n'aurez pas de contrôle sur cette dernière sauf à utiliser une classe de plus bas niveau (voir plus loin).

Avant de continuer sur le sujet, voici les limites de ce système :

  • Repose sur le système des vues indexées, il a donc les même restrictions : pas de SELECT *, non du schéma obligatoire, pas de LEFT ou de RIGHT JOIN, etc. La liste complète des restrictions : http://msdn.microsoft.com/en-us/library/aewzkxxh.aspx ou en français : http://msdn.microsoft.com/fr-fr/library/aewzkxxh.aspx
  • Et a aussi les même implications que les vues indexées en termes de performance, je ne serais trop vous recommander de ne pas mettre 2000 notifications sur la même table… D'une manière générale le système monte « mal » en charge
  • Nécessite des privilèges élevés pour les classes de plus haut niveau (SqCacheDependency et SqlDependency) au sein de la base de données et certains privilèges serveur.
  • Ouvre une nouvelle connexion, chaque notification maintien donc une connexion vers le serveur jusqu'à ce qu'elle soit levée ou passe en TimeOut (Méthode Stop, voir plus loin dans l'exemple)
  • Vous ne savez pas quel type d'opération génère la notification ni quelles sont les données modifiées, ce qui vous oblige à ré exécuter la requête pour avoir la totalité des nouvelles données (on en profite pour réamorcer la notification).
  • Peut passer en timeout ce qui oblige à réamorcer la notification. Ce réamorçage est aussi nécessaire à chaque déclenchement de cette dernière, il faut le prévoir dans le code.

En allant plus loin, vous découvrirez que 3 classes sont à votre disposition (de celle de plus haut niveau à celle de plus bas niveau) :

  • SqlCacheDependency
    • Celle-ci est en relation avec l'objet Cache de l'ASP.Net et permet de piloter le cache de sortie d'ASP.Net en fonction de la modification des données.
  • SqlDependency
    • C'est la plus courante, on fournit juste la connexion, la commande SQL et la fonction de Callback. En option il est possible de fournir le nom de la file d'attente du Broker à monitorer.
  • SqlNotificationRequest
    • C'est la plus complexe, mais aussi la plus flexible. On s'attend à ce que toute la mécanique du Service Broker soit déjà en place, seule la notification est créée. C'est aussi de votre responsabilité que de créer le thread de monitoring.

On passe maintenant aux exemples, mais avant toute chose assurez-vous d'avoir le service broker activé dans votre base de données ou sinon exécutez :

ALTER DATABASE MaBase SET NEW_BROKER

Exemple avec la classe SqlDepedency

SqlConnection cnx = new SqlConnection(connectionString);

 

// Démarre la connexion qui crée le Service Borker et sa file d'attente

SqlDependency.Start(connectionString);

 

cnx.Open();

 

SqlCommand cmd = new SqlCommand("SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", connection);

 

// Ici on défnie la dépendance sur la requête

SqlDependency dependency = new SqlDependency(cmd);

// Et la méthode de Callback

dependency.OnChange += new OnChangeEventHandler(OnDataChange);

 

// On execute la requête qui est le signal de démarrage de la surveillance de la requête

cmd.ExecuteReader();

 

cnx.Close();

Et le code de Callback :

// Le squelette du Callback, on est pas obligé de réaliser le nettoyage avec Stop ici

static void OnDataChange(object sender, SqlNotificationEventArgs e)

{

// ... on regarde entre autre (TimeOut, autre) ce qu'on a dans e.Info

 

// On détruit les objets du Broker

SqlDependency.Stop(connectionString);

}

Exemple avec la classe SqlNotificationRequest.

Je pars du principe que j'ai déjà un service existant côté base de données et une méthode qui a appel

// Création de la notification

SqlNotificationRequest not = new SqlNotificationRequest();

not.UserData = Guid.NewGuid().ToString();

not.Options = "Service=MonService";

not.Timeout = 100000;

 

// On l'associé à la requête

SqlCommand cmd = new SqlCommand("SELECT a FROM dbo.TabA", cnx);

cmd.Notification = not;

 

// Ouvre la connecion et execute la requête

cnx.Open();

 

cmd.ExecuteReader();

 

cnx.Close();

J'assume aussi le fait que vous ayez un thread séparé qui exécute la commande SQL suivante :

WAITFOR (RECEIVE * FROM MaFileDAttente);

Ma préférence va à la seconde solution car vous avez entièrement la main sur ce qui se passe côté base de données, ce qui est important en termes de permissions et pour d'autres éléments que je vous présenterais dans d'autres billets.

Un point important à garder en tête, ce système est particulièrement difficile à manipuler à cause des restrictions nombreuses, ne baissez pas les bras et lisez la liste des restrictions avec attention ! Plus la requête est simple, plus elle a de chances de passer.

Maintenant que l'on connait le fonctionnement interne, on peut imaginer des solutions tordues comme :

  • Query Notification côté serveur uniquement avec SQLCLR à « Trigger asynchrone »
  • Query Notification côté serveur pour notifier l'application
  • Imitation du système via un trigger en bonus en lui fournissant les données !
  • Fonctionnement conjoint du Query Notification avec d'autres fonctionnalités de 2008

Qui a dit que SQL Server n'était pas fun pour faire du développement .Net ?

Bonne notification…

Posté le par christian | 0 commentaire(s)
Classé sous : ,

TechDays 2010 Genève : Retrouvez-moi pour une session sur la Haute disponibilité et le ScaleOut avec SQL Server

Eh oui, cette année j'ajoute une corde de plus à mon arc concernant les conférences que je vais animer. Direction la Suisse Romande pour ses TechDays qui ont lieues à Genève.

Pour ma part je vous donne Rendez-Vous le 14 avril à 14h45 pour la session intitulée « Booster performance et fiabilité avec SQL Server en mode multi-serveur »

Au programme de cette session (version longue) :

Découvrez comment associer la puissance d'une ferme de serveurs de bases de données fonctionnant avec SQL Server ; tour à tour nous verrons les méthodes pour combiner la puissance de plusieurs instances et serveurs physiques, puis les techniques permettant de diminuer le temps de non disponibilité des serveurs de bases de données et donc des applications les exploitant.

Comment monter en charge en exploitant plusieurs instances ?

Le Parallel Datawarehouse (alias projet Madison), la nouvelle édition arrivant avec SQL Server 2008 R2 permettant l'exécution parallèle de requêtes sur de multiples instances ainsi que le chargement de données en exploitant des centaines de CPU.

Le Scalable Shared Database ou comment partager une base de données en lecture entre plusieurs instances SQL Server, grâce à un espace de stockage partagé tel qu'un SAN.

La Réplication et ses différents modes de fonctionnement en vue de synchroniser des données vers plusieurs cibles avec différents degrés de latence, une possibilité de flux bidirectionnel avec gestion de conflit et possibilité d'attaquer des périphériques mobiles.

Le ScaleOut qui, en utilisant un partitionnement multi serveur des données, permet la montée en charge d'applications de bases de données ayant de très hautes charges et très gros volumes de données.

Comment augmenter la disponibilité d'une application ?

Le Failover Clustering ou le basculement automatique d'une instance disposant des bases de données sur un espace de stockage partagé.

Le Database Mirroring qui permet synchronisation et basculement de multiples bases de données de manière automatique et en mode synchrone ou asynchrone.

Le Log Shipping qui met en œuvre une automatisation du processus de sauvegarde des journaux de transactions entre une ou plusieurs instances SQL Server en vue d'avoir une copie de récupération de données ou une source de données asynchrone pour pouvoir basculer l'application.

Que nous promet le futur sur l'exploitation de fermes de serveurs de bases de données ?

Quelques techniques ou améliorations qui verront nous dans un futur proche sur nos moteurs de bases de données favoris pour améliorer la disponibilité ou améliorer la montée en charge.

Dans l'idée je pense essayer de faire une démo avec 4 à 5 instances en ScaleOut..

Si ce n'est pas déjà fait inscrivez-vous sur le site des TechDays, ici :

http://www.microsoft.com/switzerland/msdn/fr/techdays/

J'espère vous retrouver nombreux.

Bonne sessions…

SQL Server : Estimer le nombre de lignes renvoyées par une requête avec SQLCLR

Dans certains cas très particuliers il peut être intéressant de savoir le nombre de ligne que va renvoyer une requête sans exécuter cette dernière. En effet les opérations de comptage sont généralement gourmande en ressource est très difficile à optimiser pour un usage qui n'est au final pas toujours évident.

Or SQL Server est capable par le biais de son plan d'exécution de vous signaler le nombre de ligne que statistiquement il estime devoir renvoyer. Cela reste une estimation et en fonction du type de requête le résultat changera beaucoup par rapport au compte réel, mais le chiffre est généralement proche de la réalité.

Comment extraire cette valeur du plan et l'utiliser dans son code SQL ? C'est assez complexe car il faut normalement demander à générer le plan sous forme XML (SET SHOWPLAN_XML), or c'est strictement impossible à l'intérieure d'une procédure stockée sans passer par un SQL externe, comme une commande dynamique. Le plus simple est de passer par le support .Net intégré à SQL Server, le SQLCLR.

Il nous faut créer une procédure stockées, en effet les fonctions ne supporte pas l'appel de certaines commande SET comme celle que nous allons utiliser.

Voici le code :

[Microsoft.SqlServer.Server.SqlProcedure()]

public static SqlInt32 CountFirstResult(SqlString sqlQuery, out SqlDouble rowCount)

{

 

string sqlPlanOn = "SET SHOWPLAN_XML ON";

string sqlPlanOff = "SET SHOWPLAN_XML OFF";

 

SqlCommand sqlCmd;

 

using (SqlConnection sqlCnx = new SqlConnection("context connection=true"))

{

 

sqlCnx.Open();

 

sqlCmd = new SqlCommand(sqlPlanOn, sqlCnx);

sqlCmd.ExecuteNonQuery();

 

// Set the showplan xml to ON

sqlCmd = new SqlCommand(sqlQuery.ToString(), sqlCnx);

XmlReader xmlQueryPlan = sqlCmd.ExecuteXmlReader();

 

if (xmlQueryPlan.ReadToFollowing("StmtSimple", @"http://schemas.microsoft.com/sqlserver/2004/07/showplan"))

rowCount = new SqlDouble(double.Parse(xmlQueryPlan.GetAttribute("StatementEstRows"),CultureInfo.InvariantCulture.NumberFormat));

else

rowCount = 0;

 

xmlQueryPlan.Close();

 

// Set the showplan xml to OFF

sqlCmd = new SqlCommand(sqlPlanOff, sqlCnx);

sqlCmd.ExecuteNonQuery();

 

sqlCnx.Close();

}

 

return 0;

}

Je me contente d'appeler les commandes SET SHOWPLAN_XML avant et après l'exécution de ma requête et j'extrais la valeur de l'attribut « StratementEstRows » qui est de type nombre à virgule flottante. Attention cela ne fonctionne que pour la première requête fournie dans l'état du code, mais il est possible de l'adapter pour obtenir plus d'info.

On teste le code comme suit :

DECLARE @ret float;
EXEC dbo.CountFirstResult 'SELECT * FROM sys.all_objects WHERE name like ''t%''', @ret OUT;
SELECT @ret;

Et on obtient un resultat de type numérique, dans mon cas : 841,614

Si vous ne voulez pas vous embarrasser avec la virgule, remplacez le float par un bigint comme suit :

DECLARE @ret bigint;
EXEC dbo.CountFirstResult 'SELECT * FROM sys.all_objects WHERE name like ''t%''', @ret OUT;
SELECT @ret;

Voilà pour le petit exemple de code SQLCLR pour faire une chose quasi impossible nativement dans SQL Server avec du T-SQL

En termes de resources, la requête n'est jamais utilisée, elle est uniquement compilé, ce qui ne fait que consommer un peu de resources processeur de l'ordre de quelques millisecondes.

Bon compte…

SQL Server : PHP et SQL Server

Juste une petite synthèse sur les possibilités de connecter une application PHP sur un serveur SQL Server. Non pas que je me sois reconverti en développeur PHP, mais je constate qu'actuellement il est très difficile dans un environnement PHP et particulièrement PHP Linux/Unix de se connecter à un serveur SQL Server.

Microsoft a bien diffusé un driver pour PHP permettant de se connecter à SQL Server :

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=ccdf728b-1ea0-48a8-a84a-5052214caad9

Ce driver en est à la version 1.1, il supporte SQL Server jusqu'à la version 2008. Cependant ce dernier ne supporte que les plateformes Windows ! Exit donc la possibilité de se connecter depuis une machine Linux ou Unix qui sont pourtant nombreuses et qui du coup vous donne le choix entre MySQL et de temps à autres d'autres moteurs nativement.

Il existe pour les applications PHP une alternative qui s'appelle PDO permettant de remplacer le support MySQL par un moteur alternatif, à condition que ce dernier dispose d'un driver PDO. A ce jour un certain nombre de moteurs disposent de ces drivers : SQL Lite, PostGreSQL, etc. Côté SQL Server c'est non, çà n'existe pas. On vous dira alors que sous Windows il est possible d'utiliser le driver PDO pour odbc et par le biais d'ODBC d'utiliser le driver natif de SQL Server.

Outre le fait que passer par ODBC est une solution spécifique à Windows (aucuns drivers SQL Server pour ODBC ne sont fournis pour une autre plateforme que Windows), cette dernière souffre des limitations inhérentes à ODBC.

Que reste-il à notre disposition pour les connexions depuis Unix/Linux vers SQL Server ? Un seul outil FreeTDS , qui permet le support direct du protocole TDS commun à Sybase et Microsoft sur les plateformes Unix et Linux. Malgré la diffusion récente de la documentation de TDS par Microsoft, cet outil a une mauvaise réputation dans le monde communautaire, fournit un support partiel de toutes les fonctionnalités de SQL Server et, de fait, se trouve relégué à des applications peu critiques.

Au final il y a un vrai manque : Comment peut-on développer des applications PHP travaillant par exemple sur SQL Server, solutions toutes deux gratuites, sans passer par une solution propriétaire et payante ? Personnellement je verrais bien dans un futur plus ou moins proche un WordPress fonctionnant sur un SQL Server plutôt qu'un MySQL… Rêvons un peu !

Si vous souhaitez voir un jour un driver PDO pour SQL Server… eh bien votez :

https://connect.microsoft.com/SQLServer/feedback/details/541956/pdo-driver-for-sql-server

Bon vote…

Posté le par christian | 1 commentaire(s)

SQL Server : Développer un AddOn pour SQL Server Management Studio (SSMS)

Pour celles et ceux qui aiment SQL Server et on l'âme de développeur (ou sont tout simplement développeur) et veulent étendre les fonctionnalités de SQL Server, voici un article qui devrait pouvoir un intéresser.

Certes ce dernier est écrit sur une base de 2005, avec Visual Studio 2005 et donc le Management Studio qui va avec SQL Server 2005. Mais il est facilement « adaptable » pour la version 2008.

Ça se passe ici :

http://aspalliance.com/1374_Extend_Functionality_in_SQL_Server_2005_Management_Studio_with_Addins.all

Bonne lecture…

Plus de Messages Page suivante »


Les 10 derniers blogs postés

- Article dans Programmez sur les principes SOLID par Fathi Bellahcene le il y a 51 minutes

- Parution de mon livre sur WPF 4 par Perspective le il y a 6 heures et 40 minutes

- EDM : comment utiliser l’Horizontal Entity Splitting par Matthieu MEZIL le il y a 19 heures et 48 minutes

- [WP7Dev][Reactive] Rendre les Reactive Extensions Plus Stables par Jerome Laban le 09-08-2010, 02:24

- [SharePoint 2010] [Visio] Manipulation n°1 : Comment générer automatiquement la carte d’un site Web avec Visio ? par Le blog de Patrick le 09-07-2010, 14:12

- WinDbg / SOS / PSSCOR2 : Failed to load data access DLL (mscordacwks) par CoqBlog le 09-06-2010, 22:29

- Perspective 2.0 : version finale par Perspective le 09-06-2010, 19:42

- SharePoint 2010 : Comparaison entre la version 2007 et la version 2010 par Philippe Sentenac [MVP SharePoint] le 09-06-2010, 12:00

- Utilisation de la réplication SQL dans le code .NET d'une application mobile - Implémentation & Conseils : PARTIE 1/3 (classe SqlCeReplication & premi... par Le Blog de Pi-R (Pierre Cambier) le 09-06-2010, 08:37

- Quelques trucs intéressants (05/09/2010) par CoqBlog le 09-05-2010, 14:53