SQL Server : Requêter à travers un firewall

Tout est décrit sur cette page : Lien vers MSDN
Ils précisent que ça se fait en 2 étapes :

  • Préciser à SQL Server d’utiliser le port 1433
  • Ouvrir le port sur le firewall.

Sinon :

As an alternative to configuring SQL Server to listen on a fixed port and opening the port, you can list the SQL Server executable (Sqlservr.exe) as an exception to the blocked programs.

SQL SERVER : Désactiver les contraintes sur une table.

La commande est celle-ci :
ALTER TABLE ma_table NOCHECK CONSTRAINT ALL
Pour désactiver TOUTES les contraintes de TOUTES les tables :
exec sp_MSforeachtable ’ALTER TABLE ? NOCHECK CONSTRAINT ALL’
Pour tout remettre d’équerre :
exec sp_MSforeachtable ’ALTER TABLE ? CHECK CONSTRAINT ALL’
A noter que ça marche aussi pour désactiver les triggers : ALTER TABLE ma_table DISABLE TRIGGER ALL, puis faire ENABLE pour les réactiver.
Source sur SQLServer Magazine.

Tips pour SSIS (SQL Server Integration Services)

L’héritier des lots DTS donne du fil à retordre…

    • Erreurs lors de la lecture d’un fichier plat : « LocaleID xx n’est pas installé… ».
      –> Solution : Eviter les fichiers plats de type CSV. Renommer les CSV en TXT, et ca va marcher.
    • Erreur 0xC02020A1 : « Erreur de conversion » lorsqu’on essaie d’intégrer les données d’un fichier plat vers une autre source de données.
      –> Solution : Il faut bien vérifier la taille des colonne importées. Sinon faire un clic-droit sur le composant de flux de données, puis « Afficher l’éditeur avancé > Propriétés d’entrée de de sortie > Sortie de source de fichier plat > Colonnes de sortie ». Choisir les colonnes qui plantent, et changer le paramètre TruncationRowDisposition à « RD_IgnoreFailure ».
      –> Risque : les données tronquées seront simplement notifiée.
    • Le composant de flux de données pour filtrer des données est le « Fractionnement conditionnel ».

To be continued...

SQL Server : Fichier de Log (.LDF) qui devient énorme.

Comment diminuer de taille le fichier de transactions en un seul script SQL ?
Lorsqu’une base de données est en mode de récupération « Full » (Complète), les fichiers journaux .LDF peuvent devenir énormes (toutes les transactions sont enregistrées).
En lancant le script SQL ci-dessous, vous allez sauvegarder vos bases et fichiers de transaction, et diminuer la taille du fichier LDF :

-- Sauvegarde complète
BACKUP DATABASE MaBase TO DISK = ’S:mssqlMaBase.bak’
GO
BACKUP LOG MaBase TO DISK = ’S:mssqlMaBase_log.bak’
GO
USE MaBase
GO
-- (MaBase_log est le nom LOGIQUE du fichier LDF physique... A vérifier donc !)
DBCC SHRINKFILE(MaBase_log)
GO

NB : le fait de faire une sauvegarde complète d’une BDD vide le fichier de log « LDF »… mais ne diminue pas sa taille ! C’est pourquoi il faut faire un SHRINKFILE.
NB2 : C’est pourquoi il est important de faire une sauvegarde complète une fois par jour, afin d’empêcher le fichier LDF de grossir démesurément (le fichier se « videra » puis l’espace sera réutilisé…)
NB3 : Il faut également réfléchir à passer en mode de récupération SIMPLE. Le fichier LDF ne grossira pas autant, mais la perte de données admissible en cas de crash sera plus grande.
 

SQL Server : Erreur lors d’un update de plusieurs lignes en même temps.

« La sous-requête a retourné plusieurs valeurs. Cela n’est pas autorisé… »
Une commande UPDATE toute simple mettant à jour plusieurs enregistrements peut facilement dégénérer en une erreur fort intrigante.
Exemple :
UPDATE ma_table SET departement = 44 WHERE ville = ’Nantes’
SQL Server va renvoyer l’erreur suivante :

Msg 512, Niveau 16, �tat 1, Procédure reconduite_u, Ligne 14
La sous-requête a retourné plusieurs valeurs.
Cela n’est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu’expression.
L’instruction a été arrêtée.

Sans entrer dans les détails, il faut d’abord vérifier la présence d’un éventuel TRIGGER attaché à cette table. Il suffit de le désactiver pour que la commande UPDATE se passe bien.

SQL Server : Passer des paramètres à un fichier .sql avec la commande sqlcmd

Voici un exemple de fichier script.sql :

USE ma_base
GO
UPDATE ma_table SET un_champ = ’Une valeur’ WHERE un_autre_champ = ’$(Parametre1)’
GO

Notez la présence de $(Parametre1) qui indique que le script attend une valeur passée en paramètre, dont le nom est Parametre1
Maintenant, voici le fichier .bat qui va appeler ce script SQL via la commande sqlcmd :

@echo off
sqlcmd -S mon_serveur_de_bdd -i script.sql -v Parametre1="Une autre valeur"
pause

Du coup, la requête lancée sera :
UPDATE ma_table SET un_champ = ’Une valeur’ WHERE un_autre_champ = ’Une autre valeur’
C’est pas beautiful ça ?

T-SQL : Boucler sur un curseur

Etant donné que j’oublie à chaque fois cette structure de code, je la placeune fois pour toute :

DECLARE @ma_var1 VARCHAR(255), @ma_var2 VARCHAR(255)
DECLARE mon_curseur CURSOR FOR
   SELECT col1, col2 FROM ma_table
OPEN mon_curseur
FETCH NEXT FROM mon_curseur INTO @ma_var1, @ma_var2
WHILE @@FETCH_STATUS = 0
BEGIN
   FETCH NEXT FROM mon_curseur INTO @ma_var1, @ma_var2
END
CLOSE mon_curseur
DEALLOCATE mon_curseur