mars
2011
Le protocole ouvert FTP (File Transfert Protocol) permet de réaliser des transferts de fichiers entre des machines (Windows,Linux,…) via le réseau.
En mode manuel j’utilise fréquemment les clients FTP comme WinScp ou mRemote ou FileZilla pour des transferts de fichiers entre des serveurs (Windows – Linux). Sous SQL Server il est possible d’automatiser le transfert de fichiers à l’aide du protocole FTP. On peut envisager par exemple d’automatiser le transfert des fichiers de backup du jour – 2 (J-2) sur une machine distante. Objectif : faire de la place sur le Serveur SQL tout en gardant les derniers backups (J et J-1) disponibles sur le serveur SQL.
Voici une procédure stockée qui permet de réaliser juste l’Upload d’un fichier de backup.
– =======================================================
– Description : SQL SERVER – Envoi de fichier via FTP
– Auteur : Etienne ZINZINDOHOUE
/***************** Exemple d'utilisation *************
DECLARE @Result INT
EXEC P_FTP_PUT
@FTPServer = N'ftp.xxxxxxxxxxx.fr',
@FTPUser = N'e.zinzindohoue',
@FTPPwd =N'xxxxxxxxx',
@FTPFile =N'/outgoing/ez/Backup_MaBase.bak',
@SourceFile =N'c:\Backup_MaBase.bak',
@FileTemp =N'c:\temp\cmdftp_put.txt',
@Result = @Result OUTPUT
SELECT 'Resultat'= CASE WHEN @Result=1 THEN 'Transfert SUCCESSFULLY' ELSE 'Echec' END
*****************************************************/
– =======================================================
– Drop la procedure stockée si elle existe déjà dans la base courante
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[P_FTP_PUT]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[P_FTP_PUT]
GO
CREATE PROCEDURE P_FTP_PUT
@FTPServer nvarchar(100) ,
@FTPUser nvarchar(100) ,
@FTPPWD nvarchar(100) ,
@FTPFile nvarchar(100) ,
@SourceFile nvarchar(100) ,
@FileTemp nvarchar(100) ,
@Result INT OUTPUT
AS
SET NOCOUNT ON
DECLARE @CMD nvarchar(4000)
DECLARE @TranferComplete INT
SET @Result = 0
– Traitement des caractres spéciaux
SET @FTPServer = replace(replace(replace(@FTPServer, '|', '"|"'),'<','"<"'),'>','">"')
SET @FTPUser = replace(replace(replace(@FTPUser, '|', '"|"'),'<','"<"'),'>','">"')
SET @FTPPWD = replace(replace(replace(@FTPPWD, '|', '"|"'),'<','"<"'),'>','">"')
SET @FTPFile = replace(replace(replace(@FTPFile, '|', '"|"'),'<','"<"'),'>','">"')
SET @CMD = 'echo ' + 'open ' + @FTPServer + ' > ' + @FileTemp
EXEC master..xp_cmdshell @CMD
SET @CMD = 'echo ' + @FTPUser + '>> ' + @FileTemp
EXEC master..xp_cmdshell @CMD
SET @CMD = 'echo ' + @FTPPWD + '>> ' + @FileTemp
EXEC master..xp_cmdshell @CMD
SET @CMD = 'echo ' + 'put ' + @SourceFile + ' ' + @FTPFile + ' >> ' + @FileTemp
EXEC master..xp_cmdshell @CMD
SET @CMD = 'echo ' + 'quit' + ' >> ' + @FileTemp
EXEC master..xp_cmdshell @CMD
SET @CMD = 'ftp -i -v -s:' + @FileTemp
–PRINT @CMD
—Insertion du resultat de la commande ftp dans la table @t
DECLARE @t table (id int identity(1,1), ftpmessage nvarchar(4000))
INSERT INTO @t
EXEC master..xp_cmdshell @CMD
– Test du resultat du transfert FTP
SELECT @TranferComplete = count(id) FROM @t WHERE ftpmessage LIKE '%Transfer complete%'
IF (@TranferComplete >= 1)
SET @Result = 1
GO
Pour faire l’opération inverse, c’est à dire un download voir mon billet intitulé « FTP – SQL Server (2/2) »
———————————————–
Etienne ZINZINDOHOUE
———————————————–