>Il problema è questo:
>
>se imposto la colonna calcolata non posso utilizzare quel campo
>per altri insert
>
>io invece vorrei poter salvare altri valori ed aggiornarlo solo
>in specifiche condizioni (quelle indicate)
Se in alcune circostanze intendi valorizzare espressamente la colonna, non puoi affidarti ad una colonna calcolata.
La soluzione più pulita ed efficiente è quella indicata da Alessandro, ovvero passare da una sp di INSERT/UPDATE che incapsuli la logica di inserimento/aggiornamento.
Se per VALIDI motivi non puoi adottare una soluzione del genere, sei costretto a definire un trigger.
Ti allego un piccolo esempio:
USE tempdb;
CREATE TABLE dbo.Attivita(
IDAttivita int IDENTITY(1,1) NOT NULL,
IDAttivitaStato char(1) NULL,
IDAttivitaTipo char(2) NULL
);
GO
CREATE TRIGGER trUI_Attivita
ON dbo.Attivita
FOR UPDATE, INSERT
AS
IF EXISTS(
SELECT *
FROM INSERTED
WHERE IDAttivitaTipo IN ('OK', 'NO')
)
BEGIN
UPDATE A
SET IDAttivitaStato = 'C'
FROM dbo.Attivita AS A
JOIN INSERTED AS I
ON A.IDAttivita = I.IDAttivita
END
GO
INSERT dbo.Attivita(IDAttivitaTipo) VALUES('OK');
INSERT dbo.Attivita(IDAttivitaTipo) VALUES('NO');
INSERT dbo.Attivita(IDAttivitaTipo) VALUES('SI');
INSERT dbo.Attivita(IDAttivitaTipo) VALUES(NULL);
INSERT dbo.Attivita(IDAttivitaTipo, IDAttivitaStato) VALUES('SI', 'Z');
/* 'Z' verrà sovrascritto a 'C' dal trigger' */
INSERT dbo.Attivita(IDAttivitaTipo, IDAttivitaStato) VALUES('NO', 'Z');
SELECT *
FROM dbo.Attivita;
/* Output:
IDAttivita IDAttivitaStato IDAttivitaTipo
----------- --------------- --------------
1 C OK
2 C NO
3 NULL SI
4 NULL NULL
5 Z SI
6 C NO
(6 row(s) affected)
*/
/* Aggiorno tutte le Attività Tipo a 'OK'
** ed il trigger provvederà ad allineare
** IDAttivitaTipo a 'C'
*/
UPDATE dbo.Attivita
SET IDAttivitaTipo = 'OK';
SELECT *
FROM dbo.Attivita;
/* Output:
IDAttivita IDAttivitaStato IDAttivitaTipo
----------- --------------- --------------
1 C OK
2 C OK
3 C OK
4 C OK
5 C OK
6 C OK
(6 row(s) affected)
*/
DROP TABLE dbo.Attivita;
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org