12 messaggi dal 15 agosto 2001
Salve ,
qualcuno mi puo' aiutare cortesemente
a realizzare un trigger che mi permetta di aggiorare il campo A quando viene modificato il campo B di un record di una tabella ?

Grazie mille
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
anflam ha scritto:
Salve ,
qualcuno mi puo' aiutare cortesemente
a realizzare un trigger che mi permetta di aggiorare il campo A quando viene modificato il campo B di un record di una tabella ?

Grazie mille

detta cosi' non ha molto senso, visto che potresti probabilmente utilizzare una colonna calcolata, ma forse la tua esigenza e' diversa...

presupponendo che tu debba eseguire delle "modifiche" sulla colonna di riferimento, di seguito un piccolo esempio che utilizza una colonna per contenere la stringa di tutti i codici ASCII della colonna [nome], ottenuti da una funzione utente..

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Test (
  Id int NOT NULL PRIMARY KEY,
  Nome varchar(10) NOT NULL,
  CodNome varchar(30) NULL
  );
GO
CREATE TRIGGER tr_IU_test ON dbo.Test
  FOR INSERT, UPDATE
AS BEGIN
  IF @@ROWCOUNT = 0 RETURN

  IF UPDATE(Nome) BEGIN
    UPDATE dbo.Test
      SET CodNome = dbo.ScrambleCode( i.Nome )
      FROM inserted i JOIN dbo.Test t ON i.Id = t.Id;
  END;
END;
GO
CREATE FUNCTION dbo.ScrambleCode (
  @in varchar(10)
  ) RETURNS varchar(10)
AS BEGIN
  DECLARE @out varchar(30);
  DECLARE @pos int, @l int;
  
  IF NOT  @in IS NULL AND DATALENGTH(@in) <> 0 BEGIN  
    SELECT @out = '', @l = DATALENGTH(@in), @pos = 0;
    WHILE @pos < @l BEGIN      
      SET @pos = @pos + 1;      
      SELECT @out = @out + RIGHT('0' + CONVERT( varchar, ASCII( SUBSTRING( @in, @pos, 1 ) ) ), 3 );
    END;
  END;
  RETURN (@out);
END;
GO
INSERT INTO dbo.Test (Id, Nome) VALUES ( 1 , 'anflam' );
INSERT INTO dbo.Test (Id, Nome) VALUES ( 2 , 'Andrea' );

SELECT * FROM dbo.Test;
UPDATE dbo.Test SET Id = 3 WHERE Id = 1;
SELECT * FROM dbo.Test;
UPDATE dbo.Test SET Nome = 'Pippo' WHERE Id = 2;
SELECT * FROM dbo.Test;
UPDATE dbo.Test SET Id = 4, Nome = 'Pippo2' WHERE Id = 2;
SELECT * FROM dbo.Test;

GO
DROP FUNCTION dbo.ScrambleCode;
DROP TABLE dbo.Test;

il cui risultato e'
Id Nome CodNome
----------- ---------- ----------
1 anflam 0971101021
2 Andrea 0651101001

Id Nome CodNome
----------- ---------- ----------
2 Andrea 0651101001
3 anflam 0971101021

Id Nome CodNome
----------- ---------- ----------
2 Pippo 0801051121
3 anflam 0971101021

Id Nome CodNome
----------- ---------- ----------
3 anflam 0971101021
4 Pippo2 0801051121

il trigger, valido anche per set di dati e non solo su singole righe, verifica che ci siano righe sulle quali lavorare, diversamente esce
IF @@ROWCOUNT = 0 RETURN

verifica quindi, con
IF UPDATE(Nome) BEGIN
che sia stata variata la colonna [Nome], diversamente non provvede a modifiche che causerebbero comunque richieste di risorse..

dopo di che provvede all'assegnazione della colonna [CodNome] con il risultato della funzione alla quale viene passato come parametro il valore di inserted.Nome, cioe' il "nuovo" valore della colonna [Nome] per la riga in argomento..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.