Inviare SMS da SQL Server 2005

mercoledì 23 luglio 2008 - 11.37

gmt Profilo | Junior Member

Salve, un mio applicativo asp.net 2.0, si poggia su un db SQL Server 2005.
Ogni notte, una stored procedure invia e.mail a degli utenti in base a dati presenti in una tabella.. tutto OK!

ora mi volevo appoggiare su un servizio SMS. Per inviare un SMS devo chiamare una pagina (http://invio.serversms.it/sms/send.php) che ritorna OK o KO.
I dati li ho tutti in SQL Server, cosa mi consigliate? Vorrei come per le e.mail fare una stored procedure che la sera fa l'invio.. ma come faccio da SQL server ?

ho seguito l'articolo di
http://nicholasclarke.co.uk/blog/2008/01/16/web-request-from-sql-server-via-c/
ma non riesco a togliere un ragno da un buco.. quando faccio la distribuzione mi da errore PERMISSION_SET = EXTERNAL_ACCESS, ho settato TRUSTWORTHY come da articolo, ma niente.. questa è l'unica strada? Dove posso avere maggiori info o dritte?
Grazie

lbenaglia Profilo | Guru

>ho seguito l'articolo di
>http://nicholasclarke.co.uk/blog/2008/01/16/web-request-from-sql-server-via-c/
>ma non riesco a togliere un ragno da un buco..
Carino, questa cosa servirà anche a me quando deciderò di migrare dei DTS su SQL Server 2005 che accedono via HTTP ad alcuni siti

>quando faccio
>la distribuzione mi da errore PERMISSION_SET = EXTERNAL_ACCESS,
Con distribuzione intendi il deploy dell'assembly oppure la creazione della sp?
Puoi postare i comandi precisi ed il messaggio di errore (completo di codice di errore) che ottieni?

>questa è l'unica strada?
Questa è una bella strada, disponibile a partire dalla versione 2005 di SQL Server.
In passato si utilizzavano accrocchi come Extended Stored Procedure, potenzialmente pericolose per la stabilità dell'intera istanza.

>Grazie
Prego.

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

gmt Profilo | Junior Member

Non so quali casini sono rimasti su SQL Server 2005 (sai poi si inizia a fare cose turche).. ma dovrei aver ripulito il tutto..
dal mio client quando faccio distribuzione dell'applicazione mi da il seguente errore (premetto che la connessioni la faccio con un utente creato da me, per capirci non con sa).

EXTERNAL ACCESS ASSEMBLY permission was denied on object 'server', database 'master'. WebRequest

La generazione va bene, senza errori..

Ho fatto sul mio db
ALTER DATABASE myDatabase
SET trustworthy ON

e
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
sul mio server sql

lbenaglia Profilo | Guru

>dal mio client quando faccio distribuzione dell'applicazione
Cosa intendi con "distribuzione dell'applicazione"?
Ti riferisci alla registrazione dell'Assembly con il comando CREATE ASSEMBLY?

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

gmt Profilo | Junior Member

No intendo.. quallo che vedi in figura..

lbenaglia Profilo | Guru

>No intendo.. quallo che vedi in figura..
Quale figura?
Ah, vista

Prova ad eseguire il deploy dell'assebly a manina via CREATE ASSEMBLY (tutti i dettagli sui Books Online).

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

gmt Profilo | Junior Member

Dunque ho fatto quanto segue.

1) Compilato la dll
2) Copiata la dll sul server sql server 2005
3) Eseguito sul server
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

4) Eseguito sul server
ALTER DATABASE nscScadenzario
SET trustworthy ON

5) Eseguito sul server
CREATE ASSEMBLY nscWebRequest
FROM 'c:\nascomSQLAssembly\WebRequest.dll'
WITH PERMISSION_SET = SAFE;

fin qui tutti messaggi di OK,

poi provo a fare..
SELECT [nscScadenzario].[dbo].[nscWebRequest] ('http://--YourDomain--/runthis.aspx')

ottengo..
Msg 4121, Level 16, State 1, Line 1
Cannot find either column "nscScadenzario" or the user-defined function or aggregate "nscScadenzario.dbo.nscWebRequest", or the name is ambiguous.

l'assembly ci dovrebbe essere (vedi figura)

Ciao

220x220 23Kb

lbenaglia Profilo | Guru

>CREATE ASSEMBLY nscWebRequest
>FROM 'c:\nascomSQLAssembly\WebRequest.dll'
>WITH PERMISSION_SET = SAFE;
>
>fin qui tutti messaggi di OK,
NO, quell'assembly accede a risorse esterne, di conseguenza non può avere permission set SAFE!!
Droppa l'assembly e riregistralo con permission set EXTERNAL_ACCESS.


>poi provo a fare..
>SELECT [nscScadenzario].[dbo].[WebRequest] ('http://--YourDomain--/runthis.aspx')
Mi auguro che abbia utilizzato una URL valida...

>ottengo..
>Msg 4121, Level 16, State 1, Line 1
>Cannot find either column "nscScadenzario" or the user-defined
>function or aggregate "nscScadenzario.dbo.WebRequest", or the
>name is ambiguous.
>
>l'assembly ci dovrebbe essere (vedi figura)
Dopo aver registrato l'assembly, devi creare la funzione con il comando CREATE FUNCTION...AS EXTERNAL NAME.

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

gmt Profilo | Junior Member

OK!
Ora richiamando la funzione:
SELECT [dbo].[nscWebRequest] ('http://invio.smsmobile.it/sms/send.php')
mi ritorna
Response: OK - OK

Anche se dovrebbe ritornare

KO Parametri non corretti

Se provi da web dovrebbe darti la stessa risposta.. hai una qualche idea di perchè mi dice OK?

cmq grazie.. sono felicissimo, sto usando SQL Server 2005 in maniera seria da un po' di tempo.. grazie ai tuoi consigli e qualche web cast (prima era un access con un setup piu' grande eh eh )

lbenaglia Profilo | Guru

>Se provi da web dovrebbe darti la stessa risposta.. hai una qualche
>idea di perchè mi dice OK?
No

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

gmt Profilo | Junior Member


Grz!
Ciao!

gmt Profilo | Junior Member

per chi ha letto questo (a mio parere) interessantissimo post, allego il codice per creare l'assembly in maniera da avere come risposta il testo HTML dalla pagina.

using System;
using System.Data;
using System.Net;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;

public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString WebRequest(string URL)
{
string valret = "";
try
{
// Get HTML data
WebClient client = new WebClient();
Stream data = client.OpenRead(URL);
StreamReader reader = new StreamReader(data);
string str = "";
str = reader.ReadLine();

while (str != null)
{
valret += str;
str = reader.ReadLine();
}
data.Close();

return valret;
}
catch (WebException exp)
{
return exp.Message;
}
}
};

lbenaglia Profilo | Guru

>per chi ha letto questo (a mio parere) interessantissimo post,
>allego il codice per creare l'assembly in maniera da avere come
>risposta il testo HTML dalla pagina.
Bello, grazie.

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