Triggers sur insertion avec SQL Server 2005

Triggers sur insertion avec SQL Server 2005 - SQL/NoSQL - Programmation

Marsh Posté le 09-06-2009 à 15:15:53    

Bonjour,
 
je crée une petite application permettant de gérer les réservations d'un hôtel dans le cadre de mes études.
Je souhaite crée un trigger sous SQL server permettant de vérifier lors de l'enregistrement d'un réservation si la date de début choisi pour une chambre ne correspond pas déjà à la date d'une autre réservation. En d'autres termes empêcher d'enregistrement une réservation si la chambre est déjà réservé.
 
Merci de vos réponses.  
 
ps: voici mes tables:
 
create table client
(numCli char(36) not null default newid(),
nomCli varchar(30),
pnomCli varchar(30),
rueCli varchar(40),
vilCli varchar(40),
cpCli char(5),
telCli char(10)
constraint pkCli primary key(numCli));
 
 
create table categorie
(codCat char(4)not null,
libelle varchar(30)
constraint pkCat primary key(codCat));
 
 
create table chambre
(numCham int not null ,
prix money,
codCat  char(4),
constraint pkCha primary key(numCham),
constraint fkCha foreign key (codCat) references categorie(codCat));
 
create table reservation
( numRes char(36) not null default newid(),
dateRes datetime,
dateDeb datetime,
dateFin datetime,
numCli char(36),
numCham int,
constraint pkRes primary key(numRes),
constraint fkRes1 foreign key (numCli) references Client(numCli),
constraint fkRes2 foreign key (numCham) references Chambre(numCham));

Message cité 1 fois
Message édité par nail02 le 09-06-2009 à 15:18:23
Reply

Marsh Posté le 09-06-2009 à 15:15:53   

Reply

Marsh Posté le 09-06-2009 à 15:27:55    

salut,
 

nail02 a écrit :

Merci de vos réponses.


 
ya pas de question dans ton post.  
 
 
++

Reply

Marsh Posté le 09-06-2009 à 15:36:59    

oups oui j'ai oublié la moitié du post :s en fait j'ai du mal pour créer le triggers  
j'ai fait ça:
 
 
 
CREATE TRIGGER exist_reserv
BEFORE INSERT ON reservation as
DECLARE
dateD datetime;
dateF datetime;
BEGIN
dateD := new.dateDeb
FOR EACH ROW  
if( dateD => dateDeb && dateD <DateFin)then
print('Une réservation existe déja pour cette date!');
 END IF;      
END
 
je précise je n'ai jamais crée de triggers :s et j'aurai besoin juste que l'on m'éclaire sur le sujet.

Reply

Marsh Posté le 09-06-2009 à 16:13:04    

ya toujours pas de question... :P c'est quoi ton problème? tu as une erreur? ca marche pas?

Reply

Marsh Posté le 09-06-2009 à 16:16:05    

Non ça ne marche pas. Comme je n'ai jamais crée de trigger j'ai un peu de mal j'aimerai qu'on m'aide ^^

Reply

Marsh Posté le 09-06-2009 à 16:59:08    

"ça ne marche pas", ça ne veut rien dire ! Qu'est ce qui ne marche pas ? Le trigger renvoie un message d'erreur ? Les données ne sont pas cohérentes ? Fournis un peu plus d'infos, personne n'est devin ici.

Reply

Marsh Posté le 12-06-2009 à 14:38:11    

Code :
  1. CREATE TABLE reservation
  2. (
  3.  chambre_id int,
  4.  debut datetime,
  5.  fin datetime,
  6.  nb_personnes int
  7. )
  8. go
  9.  
  10. CREATE UNIQUE INDEX ix_reservation ON reservation (chambre_id, debut)
  11. go
  12.  
  13. CREATE TRIGGER trg_reservation_ins
  14. ON reservation
  15. instead of INSERT, UPDATE
  16. AS
  17. begin
  18.  declare @nb int;
  19.  declare @nbdel int;
  20.  declare @chambre_id int;
  21.  declare @debut datetime;
  22.  declare @fin datetime;
  23.  declare @nb_personnes int;
  24.  
  25.  SELECT @nbdel = count(*) FROM deleted;
  26.  
  27.  declare cur cursor FOR SELECT chambre_id, debut, fin, nb_personnes FROM inserted;
  28.  open cur;
  29.  
  30.  fetch next FROM cur INTO @chambre_id, @debut, @fin, @nb_personnes;
  31.  
  32.  while @@fetch_status = 0
  33.  begin
  34.       SELECT @nb = count(*) FROM reservation
  35.       WHERE chambre_id = @chambre_id
  36.       AND debut >= @debut
  37.       AND debut < @fin;
  38.       
  39.       IF @nb > sign(@nbdel)
  40.       begin
  41.         RAISERROR('Les dates de réservation se chevauchent', 16, 1);
  42.       end;
  43.       else
  44.       begin
  45.         INSERT INTO reservation (chambre_id, debut, fin, nb_personnes) VALUES (@chambre_id, @debut, @fin, @nb_personnes);
  46.       end;
  47.  
  48.      fetch next FROM cur INTO @chambre_id, @debut, @fin, @nb_personnes;
  49.  end;
  50.  close cur;
  51.  deallocate cur;
  52. end;
  53. go
  54.  
  55. INSERT INTO reservation VALUES (1, '2009-01-01', '2009-01-15', 1);
  56. INSERT INTO reservation VALUES (1, '2009-01-16', '2009-01-31', 2);
  57. INSERT INTO reservation VALUES (2, '2009-01-10', '2009-01-20', 1);
  58. INSERT INTO reservation VALUES (1, '2009-01-10', '2009-01-20', 1);
  59.  
  60. SELECT *
  61. FROM reservation;

Reply

Sujets relatifs:

Leave a Replay

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