Agiornamento stato

mercoledì 11 giugno 2008 - 13.03

squilibrio Profilo | Expert

Ciao a tutti, vorrei creare un triggerino per gestire automaticamente questa tabella

CREATE TABLE [dbo].[Attivita](
[IDAttivita] [int] IDENTITY(1,1) NOT NULL,
[IDOwner] [int] NULL,
[IDAttivitaStato] [varchar](1) COLLATE Latin1_General_CI_AS NULL,
[IDAttivitaTipo] [varchar](2) COLLATE Latin1_General_CI_AS NULL,
[IDAnagrafica] [int] NULL,
[Data] [datetime] NULL CONSTRAINT [DF_Attivita_Data] DEFAULT (getdate()),
[Descrizione] [varchar](max) COLLATE Latin1_General_CI_AS NULL,
[Privato] [bit] NULL,
[LastUpdate] [datetime] NULL CONSTRAINT [DF_Attivita_LastUpdate] DEFAULT (getdate()),
CONSTRAINT [PK_Attivita] PRIMARY KEY CLUSTERED
(
[IDAttivita] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


Vorrei fare in modo che se

IDAttivitaTipo è uguale a OK o NO

IDAttivitaStato deve essere automaticamente C

Grazie mille!!!

alx_81 Profilo | Guru

>Ciao a tutti, vorrei creare un triggerino per gestire automaticamente
>questa tabella
Se puoi evitare il trigger, è meglio.

Piuttosto penserei ad una stored procedure che gestisca l'inserimento e l'aggiornamento andando a controllare i parametri passati per settare il campo IDAttivaStato.

>Grazie mille!!!
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>Vorrei fare in modo che se
>
>IDAttivitaTipo è uguale a OK o NO
>
>IDAttivitaStato deve essere automaticamente C

E' sempre meglio evitare di scomodare i "triggerini" quando esistono soluzioni più efficienti e che creano meno problemi di concorrenza
Il tuo problema può essere risolto con una semplice colonna calcolata:

USE tempdb; CREATE TABLE dbo.Attivita( IDAttivita int IDENTITY(1,1) NOT NULL, IDAttivitaStato AS CASE WHEN IDAttivitaTipo IN ('OK', 'NO') THEN 'C' ELSE NULL END , IDAttivitaTipo char(2) NULL, ); INSERT dbo.Attivita(IDAttivitaTipo) VALUES('OK'); INSERT dbo.Attivita(IDAttivitaTipo) VALUES('NO'); INSERT dbo.Attivita(IDAttivitaTipo) VALUES('SI'); INSERT dbo.Attivita(IDAttivitaTipo) VALUES(NULL); SELECT * FROM dbo.Attivita; /* Output: IDAttivita IDAttivitaStato IDAttivitaTipo ----------- --------------- -------------- 1 C OK 2 C NO 3 NULL SI 4 NULL NULL (4 row(s) affected) */ DROP TABLE dbo.Attivita;

>Grazie mille!!!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

squilibrio Profilo | Expert

Avevo pensato all'idea della colonna calcolata.... il problema è che la colonna relativa allo stato devo gestirla anche tramite inserimento... e solo in pariticolari situazioni (OK e NO) devo applicare l'aggiornamento automatico.

Posso utilizzare la tua soluzione?

Thanks

squilibrio Profilo | Expert

Nessun aiutino???

alx_81 Profilo | Guru

>Nessun aiutino???
La risposta di Lorenzo, ti illustra come puoi evitare di utilizzare trigger, imponendo una formula ad un campo per ricavarne una colonna calcolata. Come vedi l'inserimento, in base ai casi gestiti, calcola al volo il valore della colonna che ti serve. Quindi è chiaro che funziona .
Devi guardare bene la CREATE TABLE, c'è un campo che ha una formula, e quella ti evita il trigger e fa proprio ciò che chiedi.
Il campo viene aggiornato a C solo se viene soddisfatta la condizione che imponi.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

squilibrio Profilo | Expert

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)

alx_81 Profilo | Guru

>Il problema è questo:
>
>se imposto la colonna calcolata non posso utilizzare quel campo
>per altri insert
Allora torno a dirti di usare una bella stored procedure per l'inserimento
Ti fai la procedura alla quale passi dei parametri, ti fai i tuoi IF e valorizzi il campo come meglio credi
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>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
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5