Limitazioni sulle notifiche SQL

venerdì 10 febbraio 2012 - 09.45
Tag Elenco Tags  C#  |  .NET 4.0  |  Visual Studio 2010  |  SQL Server 2008 R2

sandroid Profilo | Newbie

Buongiorno, in un mio thread precedente (http://www.dotnethell.it/forum/messages.aspx?ThreadID=40226) ho chiesto aiuto in una situazione in cui mi sono trovato: io sto lavorando su SQL Server 2008 R2 e il mio collega su Visual C#; egli aveva bisogno di un servizio di notifica quando in una tabella viene aggiunto un record: la soluzione migliore che abbiamo trovato è la classe SqlDependency che offre un servizio di notifica automatico. Tutto funziona alla grande, finchè si tratta di store procedure che restituiscano query semplici. Il problema è sorto quando è stato necessario inserire:
- qualche IF nel codice SQL della store procedure
- alcune funzioni nella SELECT di ritorno
e di fatto smette di notificare. Se invece rimetto la query semplice notifica tranquillamente.
Ho controllato nella pagina MSDN relativa alle notifiche SQL (http://msdn.microsoft.com/it-it/library/ms181122.aspx) nella quale ci sono tutti i requisiti che una query/store procedure debba avere per poter essere notificata, ma non ho trovato niente che riguardi i due casi qui sopra. Se qualcuno ha avuto a che fare con questo meccanismo magari mi può dare il suo parere o qualche consiglio...
Grazie,
Ciao.

Sandro Santucciu

dinoxet Profilo | Senior Member

ciao puoi postare la sp??



DINOXET
__________________________________________
impossible is only a word

sandroid Profilo | Newbie

Certo, ne posto un esempio:

ALTER PROCEDURE [dbo].[P_NOTIFY_MOVEMENTS] (@AREA_ID INT, @STATUS BIT)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
--SET NOCOUNT ON;

IF @STATUS=1
BEGIN
SELECT MOV.AREA_CODE,
MOV.MOVEMENT_NUMBER,
MOV.MOVEMENT_TYPE,
MOV.PRIORITY,
MOV.MOVEMENT_STATUS,
WM.STATION_ID,
WM2.STATION_ID
FROM dbo.INI_WAREHOUSE_MAP AS WM INNER JOIN
dbo.PRC_MOVEMENT AS MOV ON WM.CELL_ID = MOV.CELL_ID_FROM INNER JOIN
dbo.INI_WAREHOUSE_MAP AS WM2 ON
MOV.CELL_ID_TO = WM2.CELL_ID
WHERE MOV.AREA_CODE = @AREA_ID AND
MOV.MOVEMENT_TYPE = 1
DBO.F_TEST_STATUS_BYTE(DBO.PRC_MOVEMENT.MOVEMENT_STATUS ) = 0
END

La tabella PRC_MOVEMENT contiene 2 foreign key verso la tabella INI_WAREHOUSE_MAP. Se io faccio la join come sopra non funziona il sistema di notifica perchè, da quello che ho capito, per permetterla non ti puoi riferire alla stessa entità due volte. Non capisco però come mai non digerisca l'istruzione IF e la funzione nel WHERE posta come condizione.

Grazie,
Ciao
Sandro Santucciu

alx_81 Profilo | Guru

>La tabella PRC_MOVEMENT contiene 2 foreign key verso la tabella
>INI_WAREHOUSE_MAP. Se io faccio la join come sopra non funziona
>il sistema di notifica perchè, da quello che ho capito, per permetterla
>non ti puoi riferire alla stessa entità due volte.
ci si può riferire ad una entità tutte le volte che vuoi, diciamo che fatta così rischi che se in un caso il legame non si verifica, non torni alcun record.
In questi casi devi pensare alle OUTER JOIN (left, right).
Solo che vorrei capire cosa intendi tu per notifica.. Dai per scontato che sia chiaro, ma per te una notifica è generata in base al fatto che esista almeno un record?

>Non capisco però come mai non digerisca l'istruzione IF e la funzione nel WHERE posta come condizione.
Credo ci siano due errori di sintassi:

ALTER PROCEDURE [dbo].[P_NOTIFY_MOVEMENTS] (@AREA_ID INT, @STATUS BIT) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. --SET NOCOUNT ON; IF @STATUS=1 BEGIN SELECT MOV.AREA_CODE , MOV.MOVEMENT_NUMBER , MOV.MOVEMENT_TYPE , MOV.PRIORITY , MOV.MOVEMENT_STATUS , WM.STATION_ID , WM2.STATION_ID FROM dbo.INI_WAREHOUSE_MAP AS WM JOIN dbo.PRC_MOVEMENT AS MOV ON WM.CELL_ID = MOV.CELL_ID_FROM JOIN dbo.INI_WAREHOUSE_MAP AS WM2 ON MOV.CELL_ID_TO = WM2.CELL_ID WHERE MOV.AREA_CODE = @AREA_ID AND MOV.MOVEMENT_TYPE = 1 -- manca l'operatore logico! AND? OR? -- DBO.F_TEST_STATUS_BYTE(DBO.PRC_MOVEMENT.MOVEMENT_STATUS ) = 0 END -- manca un END della stored, quello prima è l'END della IF -- qui ci vuole questo: END
--
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

sandroid Profilo | Newbie

Grazie per la risposta, l'END finale manca perchè me l'ho dimenticato, come ho fatto copia e incolla ho escluso un pò di codice commentato, tra cui l'END...la store procedure funziona perfettamente, quello che non funziona è il sistema di notifica.
Cosa intendo per sistema di notifica? Mi riferisco a un meccanismo di .NET implementato tramite la classe SqlDependency, che permette al programma di sottoscriversi a un evento di modifica di una tabella, tramite un Service Broker creato in automatico, passando una query o una store procedure; visto però che non sono bravissimo nelle spiegazioni mi permetto di lasciare un link in cui sicuramente sono molto più chiari di me (http://www.codeproject.com/Articles/144344/Query-Notification-using-SqlDependency-and-SqlCach).
Il vantaggio è di non dover pollare continuamente il database per sapere quando una tabella è stata modificata, il punto debole però sono le innumerevoli limitazioni (sono nel link che ho allegato nel messaggio precedente). Il mio problema è che tra queste limitazioni che ho evitato non ci sono quelle cui mi sono trovato davanti io, pertanto mi chiedevo se qualcuno che ha usufruito di questo metodo possa aver incontrato i miei stessi problemi.

Grazie,
Saluti
Sandro Santucciu

alx_81 Profilo | Guru

>Il vantaggio è di non dover pollare continuamente il database
>per sapere quando una tabella è stata modificata, il punto debole
>però sono le innumerevoli limitazioni (sono nel link che ho allegato
>nel messaggio precedente). Il mio problema è che tra queste limitazioni
>che ho evitato non ci sono quelle cui mi sono trovato davanti
>io, pertanto mi chiedevo se qualcuno che ha usufruito di questo
>metodo possa aver incontrato i miei stessi problemi.
mi spiace ma non ho mai seguito questo tipo di implementazione. Mi raccomando però, siccome lo trovo molto interessante. Spiega a tutti qualora dovessi trovare una soluzione.
Grazie a te.
ciao.
--
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
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