Déplacement/copie de fichier dans un trigger SQL Server

Déplacement/copie de fichier dans un trigger SQL Server - SQL/NoSQL - Programmation

Marsh Posté le 01-12-2006 à 11:39:44    

Bonjour,
 
Je voudrais savoir s'il est possible de déplacer, copier, supprimer des fichiers sur le disque (OS windows), dans un trigger (déclencheur) SQL Serveur?
 
Merci de votre aide  :jap:  
 
Olivier

Reply

Marsh Posté le 01-12-2006 à 11:39:44   

Reply

Marsh Posté le 01-12-2006 à 13:37:53    

oui c'est possible.
je suis en train de voir pour te donner un exemple

Reply

Marsh Posté le 01-12-2006 à 13:51:21    

ah!! cool
 
la je vais regarder du coté de xp_cmdshell
 
mais je suis preneur de l'exemple  :bounce:  


Message édité par molarisapa le 01-12-2006 à 13:51:44
Reply

Marsh Posté le 01-12-2006 à 14:01:59    

putain de bordel de merde de chiotte :o
 
chais pas ce qu'ils ont au boulot aujourd'hui, mais ils ont clairement décidé de me casser les nuts jusqu'au bout :o
 
chuis arrivé à la bourre, évidement, depuis 6 mois aucun serveur n'avait planté, ben à tous les serveurs étaient en rade...
ensuite je dois récupérer des données d'un site distant, évidement le modem 56k à l'autre bout était sur une ligne en dérangement... perdu deux heures à leur faire brancher sur une autre prise.
ensuite on m'a fait fare des modifs dans la base hier, ils se sont apperçu qu'ils s'étaient planté, du coup y'a plus rien qui marche, j'ai encore passé un temps pas croyable à tout remettre d'aplomb.
maintenant c'est un extract qu'à pas les bons prix, et faut que je me recoltine à la main les 7000 lignes d'un tableau excel pour rajouter la bonne colonne
sans parler du soft de backup qui est parti en live cette nuit et y'a pas moyen de contacter le support
et des putains de requêtes qui durent 2 heures à éxécuter ce soir avant de partir
 
bordel :o
 
bon, dès que j'ai un peu de temps, je me repenche sur ton problème (j'y suis presque à vrai dire)

Reply

Marsh Posté le 01-12-2006 à 14:02:23    

ps : c'est effectivement avec xp_cmdshell que je te fais l'exemple

Reply

Marsh Posté le 01-12-2006 à 14:04:38    

rhâââââaaaaa putain !
pis j'avais pas ouvert ma messagerie, j'ai au moins 30 mails de problèmes à régler de toute urgence :cry:
(et dire que j'ai absolument rien à faire depuis 15 jours... y'a vraiment des jours comme ça :/)


Message édité par MagicBuzz le 01-12-2006 à 14:05:01
Reply

Marsh Posté le 01-12-2006 à 15:28:32    

Voilà.
 
Alors, le script de test SQL :
 


create table fichier (nom varchar(255) primary key);
go
 
CREATE TRIGGER trg_fichier_ins  
ON fichier  
INSTEAD OF INSERT
AS
  declare @new_nom as varchar(50);
  declare @shell as varchar(8000);
  declare ins_cur cursor FAST_FORWARD for (select nom from inserted);
BEGIN
  open ins_cur;
  fetch next from ins_cur into @new_nom;
 
  while @@FETCH_STATUS = 0
  begin
    if @new_nom = 'model.txt'
    begin
      RAISERROR('model.txt : nom de fichier réservé', 16, 1)
    end    
    else
    begin
      insert into fichier (nom) values (@new_nom);
      set @shell = 'copy c:\in\trigger\model.txt c:\in\trigger\' + @new_nom;
      exec master..xp_cmdshell @shell, no_output;
    end
    fetch next from ins_cur into @new_nom;
  end
END;
go
 
CREATE TRIGGER trg_fichier_del  
ON fichier  
INSTEAD OF DELETE
AS
  declare @old_nom as varchar(50);
  declare @shell as varchar(8000);
  declare del_cur cursor FAST_FORWARD for (select nom from deleted);
BEGIN
  open del_cur;
  fetch next from del_cur into @old_nom;
 
  while @@FETCH_STATUS = 0
  begin
    delete fichier where nom = @old_nom;
    set @shell = 'del c:\in\trigger\' + @old_nom;
    exec master..xp_cmdshell @shell, no_output;
    fetch next from del_cur into @old_nom;
  end
END;
go
 
CREATE TRIGGER trg_fichier_upd
ON fichier  
INSTEAD OF UPDATE
AS
  declare @ins_nom as varchar(50);
  declare @del_nom as varchar(50);
  declare @shell as varchar(8000);
  declare ins_cur cursor FAST_FORWARD for (select nom from inserted);
  declare del_cur cursor FAST_FORWARD for (select nom from deleted);
BEGIN
  open ins_cur;
  open del_cur;
  fetch next from ins_cur into @ins_nom;
  fetch next from del_cur into @del_nom;
 
  while @@FETCH_STATUS = 0
  begin
    if @ins_nom = 'model.txt'
    begin
      RAISERROR('model.txt : nom de fichier réservé', 16, 1)
    end    
    else
    begin
      update fichier set nom = @ins_nom where nom = @del_nom;
      set @shell = 'move c:\in\trigger\' + @del_nom + ' c:\in\trigger\' + @ins_nom;
      exec master..xp_cmdshell @shell, no_output;
    end
    fetch next from ins_cur into @ins_nom;
    fetch next from del_cur into @del_nom;
  end
END;
go
 
insert into fichier (nom) values ('test.txt');
insert into fichier (nom) values ('test2.txt');
insert into fichier (nom) values ('test3.txt');
delete fichier where nom in ('test3.txt', 'test.txt');
update fichier set nom = 'toto.txt' where nom = 'test2.txt';
 
select *
from fichier;


 
Résultat :


 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(2 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
 
(1 ligne(s) affectée(s))
nom
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
toto.txt
 
(1 ligne(s) affectée(s))


 
Avant :


C:\in\trigger>dir
 Le volume dans le lecteur C n'a pas de nom.
 Le numéro de série du volume est 14E3-DAD6
 
 Répertoire de C:\in\trigger
 
12/01/2006  12:25 PM    <REP>          .
12/01/2006  12:25 PM    <REP>          ..
12/01/2006  12:25 PM                 4 model.txt
               1 fichier(s)                4 octets
               2 Rép(s)  23,535,226,880 octets libres


 
Après :


C:\in\trigger>dir
 Le volume dans le lecteur C n'a pas de nom.
 Le numéro de série du volume est 14E3-DAD6
 
 Répertoire de C:\in\trigger
 
12/01/2006  03:18 PM    <REP>          .
12/01/2006  03:18 PM    <REP>          ..
12/01/2006  12:25 PM                 4 model.txt
12/01/2006  12:25 PM                 4 toto.txt
               2 fichier(s)                8 octets
               2 Rép(s)  23,524,823,040 octets libres


 
Pour pouvoir executer xp_cmd_shell :
http://magicbuzz.multimania.com/files/cmd_shell1.png
 
http://magicbuzz.multimania.com/files/cmd_shell2.png
 
http://magicbuzz.multimania.com/files/cmd_shell3.png

Reply

Marsh Posté le 01-12-2006 à 15:29:31    

bon, j'y retourne, encore une folle qui a tout pété son pc :o

Reply

Marsh Posté le 01-12-2006 à 18:11:43    

Enorme  :love:  
 
Bon je vais regarder tout ca attentivement
 
Merci l'ami
 
 :bounce:  :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed