Store procedure e trigger

mercoledì 06 ottobre 2010 - 17.09

Bolo Profilo | Junior Member

Ciao a chi legge!!!!

Utilizzo un software che recupera i dati da SQL Server. È possibile impostare dei trigger che richiamano delle store procedure (SP).

Nel mio caso, al salvataggio del record si attiva il trigger e fa partire la SP1. Questa scrive su due tabelle distinte.
Di seguito parte la SP2 che recupera i dati dalle due tabelle solo che da una li pesca aggiornati e dall’altra no.
Se risalvo e ripartono le due store procedure i dati sono aggiornati in entrambe.

Mi rendo conto di non essere particolarmente chiaro, ma non so come esplicitare meglio il problema.
Qualcuno dalla mia descrizione riesce ad intuire unì’ipotetica soluzione?

Grazie

carloalberto Profilo | Junior Member

>come esplicitare meglio il problema.
>Qualcuno dalla mia descrizione riesce ad intuire unì’ipotetica
>soluzione?

prova a postare un esempio di quello che fai .... e di quello che vorresti :-)

>Grazie
prego
Carlo Alberto

alx_81 Profilo | Guru

Ciao
>Utilizzo un software che recupera i dati da SQL Server. È possibile
>impostare dei trigger che richiamano delle store procedure (SP).
è una domanda questa?

>Nel mio caso, al salvataggio del record si attiva il trigger
>e fa partire la SP1. Questa scrive su due tabelle distinte.
>Di seguito parte la SP2 che recupera i dati dalle due tabelle
>solo che da una li pesca aggiornati e dall’altra no.
>Se risalvo e ripartono le due store procedure i dati sono aggiornati
>in entrambe.
Questo sembra un problema di transazione. Attenzione, perchè dipende da come scrivi il trigger, dai livelli di isolamento delle transazioni, insomma, fai molta attenzione a definire dei trigger che fanno tante logiche su altre tabelle. Nel migliore dei casi non vedi ancora i record che non sono committati, nel peggiore generi dei deadlock che poi sono veramente complessi da scovare o da evitare seguendo queste strade.
>
>Mi rendo conto di non essere particolarmente chiaro, ma non so
>come esplicitare meglio il problema.
>Qualcuno dalla mia descrizione riesce ad intuire unì’ipotetica
>soluzione?
Quoto carloalberto, prova a postare quello che hai fatto, e spiegaci bene che succede in base al codice e "quando".
>Grazie
di nulla!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

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

Bolo Profilo | Junior Member

La prima è un'affermazione

In questo software è possibile associare delle store procedure all'inserimento o all'aggiornamento dei record in una tabella mediante un trigger proprietario del sistema.
Inserire qui il codice non so se abbia senso visto che si rifà a un sacco di tabelle ed è anche lunghetto, ma posso anche farlo volendo.
Però sta di fatto che se eseguo solo la prima store procedure le due tabelle sono aggiornate correttamente. Se eseguo la prima e a seguire la seconda, quest'ultima non prende i dati aggiornati da una delle due tabelle.

Vedrò di indagare in altro modo, non è un problema semplice da spiegare in un forum mi sa

Bolo Profilo | Junior Member

Dopo potenti elucubrazioni mentali ho pensato di fare così:

Al salvataggio nel software si attiva una store procedure che mi inserisce nel campo CODICE di una tabella il valore e lascia gli altri campi su NULL.
A questa tabella è associato un trigger che ad ogni nuovo inserimento di record compila tutti gli altri campi.

Il problema ora è compilare correttamente il codice di questo trigger; tempo di sbagliare la selezione del codice:

SET @CODICE = (SELECT CODICE FROM inserted)

Non prende ancora i dati aggiornati... mah...

Di seguito il codice completo:

USE EAM

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER trigger [CUST_COMPILA_ORE]
on [dbo].[CLA_CUST_TAB_REPORT]
for insert

AS

DECLARE @TIPO nvarchar(30)
DECLARE @CODICE nvarchar(30)
DECLARE @DESCRIZIONE nvarchar(80)
DECLARE @SEDE nvarchar(30)
DECLARE @OPERATORE nvarchar(30)
DECLARE @INIZIO_EFF datetime
DECLARE @FINE_EFF datetime
DECLARE @INIZIO datetime
DECLARE @FINE datetime
DECLARE @ORD_DIU decimal(18, 0)
DECLARE @ORD_NOT decimal(18, 0)
DECLARE @ORD_FES decimal(18, 0)
DECLARE @ORD_FEN decimal(18, 0)
DECLARE @ORD_EXT_DIU decimal(18, 0)
DECLARE @ORD_EXT_NOT decimal(18, 0)
DECLARE @ORD_EXT_FES decimal(18, 0)
DECLARE @ORD_EXT_FEN decimal(18, 0)
DECLARE @STR_DIU decimal(18, 0)
DECLARE @STR_NOT decimal(18, 0)
DECLARE @STR_FES decimal(18, 0)
DECLARE @STR_FEN decimal(18, 0)
DECLARE @FERIE decimal(18, 0)
DECLARE @PERMESSO decimal(18, 0)
DECLARE @MALATTIA nvarchar(1)
DECLARE @CAUSALE_IN nvarchar(30)
DECLARE @CAUSALE_OUT nvarchar(30)

-- Seleziono i dati che mi servono dalla tabella R55EVENTS e se non ci sono genero l'errore

SET @CODICE = (SELECT CODICE FROM inserted)

-- Compilo tutti i dati che mi servono

BEGIN

SELECT @TIPO = UCO_DESC,
@CODICE = @CODICE,
@DESCRIZIONE = EVT_DESC,
@SEDE = EVT_OBJECT,
@OPERATORE= EVT_PERSON,
@INIZIO_EFF = dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE, 'i'),
@FINE_EFF = dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE, 'f'),
@INIZIO = dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE, 'ic'),
@FINE = dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE, 'fc'),
@ORD_DIU = dbo.CUST_ORE_LAVORATE (dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'ic'),dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'fc'),@CODICE,(0),(0),(0)),
@ORD_NOT = dbo.CUST_ORE_LAVORATE (dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'ic'),dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'fc'),@CODICE,(0),(1),(0)),
@ORD_FES = dbo.CUST_ORE_LAVORATE (dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'ic'),dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'fc'),@CODICE,(1),(0),(0)),
@ORD_FEN = dbo.CUST_ORE_LAVORATE (dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'ic'),dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'fc'),@CODICE,(1),(1),(0)),
@ORD_EXT_DIU = dbo.CUST_ORE_LAVORATE (dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'ic'),dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'fc'),@CODICE,(0),(0),(1)),
@ORD_EXT_NOT = dbo.CUST_ORE_LAVORATE (dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'ic'),dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'fc'),@CODICE,(0),(1),(1)),
@ORD_EXT_FES = dbo.CUST_ORE_LAVORATE (dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'ic'),dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'fc'),@CODICE,(1),(0),(1)),
@ORD_EXT_FEN = dbo.CUST_ORE_LAVORATE (dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'ic'),dbo.CUST_RESTITUISCI_ORE_REPORT (@CODICE,'fc'),@CODICE,(1),(1),(1)),
@STR_DIU = NULL,
@STR_NOT = NULL,
@STR_FES = NULL,
@STR_FEN = NULL,
@FERIE = NULL,
@PERMESSO = NULL,
@MALATTIA = NULL,
@CAUSALE_IN = EVT_UDFCHAR01,
@CAUSALE_OUT = EVT_UDFCHAR02

FROM R5EVENTS

LEFT OUTER JOIN R5PROPERTYVALUES
ON EVT_CODE = PRV_CODE

LEFT OUTER JOIN R5UCODES
ON EVT_JOBTYPE = UCO_CODE

WHERE EVT_CODE = @CODICE AND(EVT_JOBTYPE = 'UTNTO' or EVT_JOBTYPE = 'UTNSP') AND EVT_STATUS = 'C' AND
(PRV_PROPERTY = 'UTNCIN' OR PRV_PROPERTY = 'UTNCOUT' OR PRV_PROPERTY = 'UTNIN' OR PRV_PROPERTY = 'UTNOUT')

group by evt_code, uco_desc, evt_desc, evt_object, EVT_PERSON,EVT_UDFCHAR01,EVT_UDFCHAR02

END

BEGIN
UPDATE CLA_CUST_TAB_REPORT
SET
TIPO = @TIPO,
CODICE = @CODICE,
DESCRIZIONE = @DESCRIZIONE,
SEDE = @SEDE,
OPERATORE = @OPERATORE,
INIZIO_EFF = @INIZIO_EFF,
FINE_EFF = @FINE_EFF,
INIZIO = @INIZIO,
FINE = @FINE,
ORD_DIU = @ORD_DIU,
ORD_NOT = @ORD_NOT,
ORD_FES = @ORD_FES,
ORD_FEN = @ORD_FEN,
ORD_EXT_DIU = @ORD_EXT_DIU,
ORD_EXT_NOT = @ORD_EXT_NOT,
ORD_EXT_FES = @ORD_EXT_FES,
ORD_EXT_FEN = @ORD_EXT_FEN,
STR_DIU = @STR_DIU,
STR_NOT = @STR_NOT,
STR_FES = @STR_FES,
STR_FEN = @STR_FEN,
FERIE = @FERIE,
PERMESSO = @PERMESSO,
MALATTIA = @MALATTIA,
CAUSALE_IN = @CAUSALE_IN,
CAUSALE_OUT = @CAUSALE_OUT
WHERE CODICE = @CODICE
GOTO GO_BACK

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