Newsgroup: it.comp.appl.access
Titolo: Trigger SQL

Ciao a tutti,
ADE permette, ovviamente, l'uso dei trigger per ottenere l'aggiornamento
automatico delle tabelle relazionate.
ma siccome sono un ignorante e dal libro che ho comprato non ho trovato ne
esempi ne spiegazioni relative ai trigger su update (che pirlata di libro,
ve lo sconsiglio - SQL SErver 7 guida completa - apogeo) per tutti questi
motivi spero che qualcuno mi possa illuminare con qualche esempio.
Ciao a tutti
Sib

CREATE TRIGGER <NOME> FOR
UPDATE
AS
<ISTRUZIONI T-SQL>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_
create2_7eeq.asp
Trovi tutto.. sarebbe lungo spiegare..
Ciao
"Sib" <si...@SPAMiol.it> ha scritto nel messaggio
news:pm9ua.105560$K35.2...@news2.tin.it...


 Trovi tutto.. sarebbe lungo spiegare..
Ti ringrazio, comunque bastava un esempio qualsiasi, era per capire.
Vado subito a vedere.
Ciao
Sib

E' un po' lungo.. cmq č un esempio...
Ciao
CREATE TRIGGER TR_TABINT_UPD ON dbo.TabInt
FOR UPDATE
AS
DECLARE @SYS_USR CHAR(50)
DECLARE @IDINT INT
DECLARE @OLDSTATO INT
DECLARE @NEWSTATO INT
DECLARE @OLDRIS INT
DECLARE @NEWRIS INT
DECLARE @STRINGA VARCHAR(100)
DECLARE @STR1 VARCHAR(100)
DECLARE @STR2 VARCHAR(100)
DECLARE @IDDOC INT
SET @SYS_USR = SYSTEM_USER
DECLARE CURS CURSOR LOCAL FOR
SELECT T1.IDINT, ISNULL(T1.IDSTATO,0) AS NEWSTATO, ISNULL(T2.IDSTATO,0) AS
OLDSTATO,ISNULL(T1.IDRISORSA,0) AS NEWRIS, ISNULL(T2.IDRISORSA,0) AS OLDRIS,
T1.IDDOC
FROM INSERTED T1 LEFT JOIN DELETED T2 ON T1.IDINT = T2.IDINT
WHERE T1.IDSTATO<>T2.IDSTATO OR T1.IDRISORSA<>T2.IDRISORSA OR
T1.IDDOC<>T2.IDDOC
OPEN CURS
FETCH NEXT FROM CURS INTO @IDINT,@NEWSTATO,@OLDSTATO,@NEWRIS,@OLDRIS,@IDDOC
WHILE @@FETCH_STATUS=0
BEGIN
 IF UPDATE(IDSTATO)
 BEGIN
  IF @NEWSTATO<>@OLDSTATO
  BEGIN
   SELECT @STR1=DESCRIZIONESTATO FROM TABSTATI WHERE IDSTATO=@OLDSTATO
   SELECT @STR2=DESCRIZIONESTATO FROM TABSTATI WHERE IDSTATO=@NEWSTATO
--   SET @STRINGA='Cambio stato da ' + STR(@OLDSTATO,4) + ' a ' +
STR(@NEWSTATO,4)
   SET @STRINGA='Cambio stato da ' + @STR1 + ' a ' + @STR2
   INSERT INTO tStorico(fIDInt, fUtente, fDataOra, fDescrizione, fLog)
   VALUES (@IDINT,@SYS_USR,GETDATE(),@STRINGA,'TR_TABINT_UPD')
  END
  IF @NEWRIS<>@OLDRIS
  BEGIN
   SELECT @STR1=COGNOME + ' ' + NOME FROM TABPERSONALE WHERE ID=@OLDRIS
   SELECT @STR2=COGNOME + ' ' + NOME FROM TABPERSONALE WHERE ID=@NEWRIS
--   SET @STRINGA='Cambio risorsa da ' + STR(@OLDRIS,4) + ' a ' +
STR(@NEWRIS,4)
   SET @STRINGA='Cambio risorsa da ' + @STR1 + ' a ' + @STR2
   INSERT INTO tStorico(fIDInt, fUtente, fDataOra, fDescrizione, fLog)
   VALUES (@IDINT,@SYS_USR,GETDATE(),@STRINGA,'TR_TABINT_UPD')
  END
 END
 IF UPDATE(IDDOC)
 BEGIN
  SELECT @STRINGA=ISNULL(NUMERODOCUMENTO,'') FROM ATIGSQLEU.DBO.ATTDOCTESTE
WHERE IDDOC=@IDDOC
  IF @IDDOC=0
  BEGIN
   SET @STRINGA='Ordine relativo all''intervento eliminato'
  END
  ELSE
  BEGIN
   SET @STRINGA='Intervento passato in ordine con ID Doc. nr. ' +
STR(@IDDOC,6) + ' - Numero Doc. ' + @STRINGA
  END
  INSERT INTO tStorico(fIDInt, fUtente, fDataOra, fDescrizione, fLog)
  VALUES (@IDINT,@SYS_USR,GETDATE(),@STRINGA,'TR_TABINT_UPD')
 END
 FETCH NEXT FROM CURS INTO @IDINT,@NEWSTATO,@OLDSTATO,@NEWRIS,@OLDRIS,@IDINT
END
CLOSE CURS
DEALLOCATE CURS
"Sib" <si...@SPAMiol.it> ha scritto nel messaggio
news:LG9ua.105765$K35.2...@news2.tin.it...


"Sib" <si...@SPAMiol.it> ha scritto nel messaggio
news:pm9ua.105560$K35.2...@news2.tin.it...

Ciao Sib
Ti posto un esempio un trigger che controlla la referenza della tabella
Co_Mastri che ha come Tabella Padre Co_Qualifiche e come tabella Figlio
Co_Conti
Il Trigger lavora in fase di variazione record (FOR UPDATE) .
CREATE TRIGGER T_CO_Mastri_UTrig ON [CO_Mastri] FOR UPDATE AS
SET NOCOUNT ON
/* * IMPEDISCE AGGIORNAMENTI SE NON TROVA CHIAVE CORRISPONDENTE IN
"CO_Qualifiche" */
IF UPDATE(Qualifica)
    BEGIN
        IF (SELECT COUNT(*) FROM inserted) !=
           (SELECT COUNT(*) FROM CO_Qualifiche, inserted WHERE
(CO_Qualifiche.ID_Qualifica = inserted.Qualifica))
            BEGIN
                RAISERROR 44446 'Impossibile aggiungere o modificare il
record. Le regole di integrità referenziale richiedono l''immissione di un
record correlato nella tabella ''CO_Qualifiche''.'
                ROLLBACK TRANSACTION
            END
    END
/* * AGGIORNAMENTO A CATENA A "CO_Conti" */
IF UPDATE(Mastro)
    BEGIN
       UPDATE CO_Conti
       SET CO_Conti.Mastro = inserted.Mastro
       FROM CO_Conti, deleted, inserted
       WHERE deleted.Mastro = CO_Conti.Mastro
    END
Comunque è noioso controllare le referenze con i trigger, potresti passare a
Sql2000 dove le referenze vengono gestite dalle CONSTRAINT REFERENCE (Tipo
Access)
Ciao Giorgio

 Trovi tutto.. sarebbe lungo spiegare..
Ti ringrazio sempre per il suggerimento, ma non mi sembra molto complessa
come sintassi:
Alter Trigger TABLE1_Trigger1
On dbo.TABLE1
For Update
As
IF (COLUMNS_UPDATED() & 1) > 0
BEGIN
UPDATE TABLE2 SET table2.IDs=ins.ID FROM inserted ins WHERE TAble2.IDs in
(SELECT del.ID FROM deleted del)
END
-------------
Funziona perfettamente tranne che per un piccolo particolare, le due tabelle
non devono essere relazionate.
Il che ovviamente non e'.
come si puo' cambiare la sintassi in questo caso?
Sib

 Sib
Ciao
Enrico

 Ciao Giorgio
Ciao

 è il top..
Purtroppo SQL Server ti dà la scelta fra i trigger e DRI, che però non
gestisce i cascade

 ha scritto nel messaggio
news:b9dr3g$if4aa$1...@ID-191593.news.dfncis.de...

Le Constraint Reference sono state inserite nella versione 2000 almeno così
dice il manuale.
ALTER TABLE [dbo].[CO_Conti] ADD CONSTRAINT [FK_CO_Conti_CO_Mastri] FOREIGN
KEY
 (  [Mastro] )
REFERENCES [CO_Mastri] (  [Mastro] )
ON DELETE CASCADE  ON UPDATE CASCADE
Ciao Giorgio.