Problema con aggiornamento tabelle in SQL Server Management Studio Exp...

martedì 09 marzo 2010 - 12.35

JusticeGundam Profilo | Newbie

Buongiorno,

mi rivolgo a chi è più esperto di me nel settore di SQL Server Management Studio Express per risolvere un problema.

Nel mio database ho creato due tabelle, che chiameremo Prezziario_1 e Prezziario_2, e le ho popolate dei dati che mi servivano. Adesso, il mio obiettivo e' fare in modo che, ogni volta che aggiungo un elemento a Prezziario_1, questo stesso elemento (o meglio, alcuni dei suoi campi) venga automaticamente inserito anche in Prezziario_2. Ho cercato di risolvere la situazione con un Trigger apposito, ma non ho avuto successo. Qualcuno potrebbe darmi qualche suggerimento per risolvere il problema?

Ringrazio anticipatamente.

lbenaglia Profilo | Guru

>il mio obiettivo e' fare in modo che, ogni volta che aggiungo
>un elemento a Prezziario_1, questo stesso elemento (o meglio,
>alcuni dei suoi campi) venga automaticamente inserito anche in
>Prezziario_2. Ho cercato di risolvere la situazione con un Trigger
>apposito, ma non ho avuto successo. Qualcuno potrebbe darmi qualche
>suggerimento per risolvere il problema?

Ciao Enrico,

Se la sincronizzazione deve avvenire in tempo reale gli after trigger DML sono la soluzione corretta, diversamente puoi schedulare un job con gli opportuni comandi T-SQL che in modo asincrono vada ad allineare la seconda tabella.
Ora, per ricevere un supporto mirato devi preparare un esempio completo con la struttura delle due tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il risultato finale che intendi ottenere con quei dati.

>Ringrazio anticipatamente.
Prego.

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

JusticeGundam Profilo | Newbie

Grazie per l'offerta!

Allora, devo premettere che queste tabelle le ho create tramite SQL Server Management Studio Express 2005 come parti di un database - in pratica, ho potuto definire le tabelle e inserire gli elementi senza dover scrivere il codice in SQL. Entrambe le tabelle hanno la stessa struttura e sono composte dagli stessi campi:

Prezziario_1 / Prezziario_2

- Codice (int, chiave primaria)
- Descrizione_Breve (varchar(MAX))
- Descrizione (varchar(MAX))
- Prezzo (money)

Il mio dilemma e' questo - vorrei fare in modo che, ogni volta che inserisco (manualmente) un nuovo elemento nella tabella Prezziario_1, i campi Codice, Descrizione_Breve e Descrizione di questo nuovo elemento siano automaticamente inseriti nella tabella Prezziario_2. Io ho pensato che un trigger apposito mi avrebbe permesso di ottenere questo risultato, ma non sono sicuro se un trigger scritto per una certa tabella possa influenzare anche altre tabelle (sì, lo so, sono ancora un principiante con SQL... )

Domani posso postare il codice che ho scritto, in modo che chi volesse mi possa indicare quali sono gli errori che commetto.

Grazie mille!

lbenaglia Profilo | Guru

>Allora, devo premettere che queste tabelle le ho create tramite
>SQL Server Management Studio Express 2005 come parti di un database
>- in pratica, ho potuto definire le tabelle e inserire gli elementi
>senza dover scrivere il codice in SQL.
OK, ma da SQL Server Management Studio Express puoi esportarne la struttura sottoforma di comandi SQL semplicemente selezionando la tabella, tasto DX, Script Table as... > CREATE To > Clipboard ed incollando il contenuto in un nuovo post di questo thread.

>Entrambe le tabelle hanno
>la stessa struttura e sono composte dagli stessi campi:
>
>Prezziario_1 / Prezziario_2
>
>- Codice (int, chiave primaria)
>- Descrizione_Breve (varchar(MAX))
>- Descrizione (varchar(MAX))
>- Prezzo (money)

Descrizione_Breve definita come varchar(MAX) è un po' un controsenso, non trovi?
I BOL riportano: "Use varchar(max) when the sizes of the column data entries vary considerably, and the size might exceed 8,000 bytes." e non credo che una descrizione BREVE possa superare gli 8000 caratteri.
Analogo discorso per la colonna Descrizione.
Tieni presente che è sempre meglio definire la dimensione delle colonne in modo da non sciupare spazio prezioso nel nostro db e per introdurre implicitamente una prima forma di constraint sui dati.

>Il mio dilemma e' questo - vorrei fare in modo che, ogni volta
>che inserisco (manualmente) un nuovo elemento nella tabella Prezziario_1,
>i campi Codice, Descrizione_Breve e Descrizione di questo nuovo
>elemento siano automaticamente inseriti nella tabella Prezziario_2.
>Io ho pensato che un trigger apposito mi avrebbe permesso di
>ottenere questo risultato, ma non sono sicuro se un trigger scritto
>per una certa tabella possa influenzare anche altre tabelle (sì,
>lo so, sono ancora un principiante con SQL... )
Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.Prezziario_1( Codice int NOT NULL PRIMARY KEY, Descrizione_Breve varchar(5) NOT NULL, Descrizione varchar(15) NOT NULL, Prezzo money NOT NULL ); CREATE TABLE dbo.Prezziario_2( Codice int NOT NULL PRIMARY KEY, Descrizione_Breve varchar(5) NOT NULL, Descrizione varchar(15) NOT NULL, Prezzo money NULL ); GO CREATE TRIGGER dbo.trI_Prezziario_1 ON dbo.Prezziario_1 FOR INSERT AS INSERT dbo.Prezziario_2(Codice, Descrizione_Breve, Descrizione) SELECT Codice, Descrizione_Breve, Descrizione FROM INSERTED; GO INSERT dbo.Prezziario_1 VALUES(1, 'DESC1', 'Descrizione 1', 10); SELECT * FROM dbo.Prezziario_1; /* Output: Codice Descrizione_Breve Descrizione Prezzo ----------- ----------------- --------------- --------------------- 1 DESC1 Descrizione 1 10,00 (1 row(s) affected) */ SELECT * FROM dbo.Prezziario_2; /* Output: Codice Descrizione_Breve Descrizione Prezzo ----------- ----------------- --------------- --------------------- 1 DESC1 Descrizione 1 NULL (1 row(s) affected) */ DROP TABLE dbo.Prezziario_1, dbo.Prezziario_2;

Il trigger DML di INSERT che ho definito sulla tabella Prezziario_1 non fa altro che popolare la tabella Prezziario_2 con le colonne Codice, Descrizione_Breve e Descrizione.
La tabella virtuale INSERTED contiene tutte le righe inserite nella transazione corrente.

Ora, se intendi mantenere una sincronizzazione completa tra le due tabelle dovrai definire altri 2 triggers, uno di DELETE ed uno di UPDATE.
Prova da solo per esercizio, consultando queste pagine dei Books Online:
http://msdn.microsoft.com/it-it/library/ms178110.aspx
http://msdn.microsoft.com/it-it/library/ms189799.aspx

>Domani posso postare il codice che ho scritto, in modo che chi
>volesse mi possa indicare quali sono gli errori che commetto.
>
>Grazie mille!
Prego.

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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5