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