Generalmente nelle applicazioni tradizionali l'application e il data tier risiedono nello stesso data center. L'introduzione di Azure e del cloud computing in generale ha creato nuovi scenari dove questa architettura può essere variata in molti modi. SQL Azure è il servizio di database relazionali della piattaforma Azure. In questo articolo vedremo come le nostre applicazioni possono accedere ai dati tramite SQL Azure.
Scenari
Ci sono due scenari principali. Nel primo il codice applicativo rimane on-premise mentre i database sono in SQL Azure. In questo caso le applicazioni useranno delle librerie client per eseguire le operazioni di accesso ai dati. Nel secondo scenario anche l'applicazione è in "the cloud" e viene ospitata in Windows Azure e utilizza le stesse librerie client del primo caso. Sebbene l'approccio alla programmazione SQL sia molto simile a quello che si userebbe quando i database SQL Server sono locali, nel programmare SQL Azure vanno tenute in conto sia alcune limitazioni in T-SQL (che vedremo più avanti) sia il fatto che la latenza di rete è certamente maggiore specialmente nel primo scenario (nel caso in cui l'applicazione sia su Windows Azure il problema è notevolmente inferiore).
Hello World
Prima di andare avanti con l'architettura di SQL Azure, e con delle considerazioni più sistematiche, è tempo per un "Hello, World" riveduto e corretto che ci dia modo di mettere subito le mani sul codice. Creiamo un database su SQL Azure e scriviamo un'applicazione on-premise che accede a dati su questo database: niente di eclatante, ma d'altra parte è un "Hello, World" no? Ci sono due modi per creare un database partendo da zero: usare il portale o tramite un'istruzione CREATE DATABASE. Dal portale sql.azure.com, dopo aver acceduto con il proprio account, basta utilizzare il pannello "Databases" per creare un nuovo database. Per default il firewall di Azure blocca l'accesso ai client. Per garantire l'accesso è necessario inserire una regola all'interno del tab "Firewall".
Con quattro click abbiamo creato un nuovo database, WilloPlayground, e abbiamo garantito l'accesso al client (il bottone "Test Connectivity" consente di controllare se le impostazioni del firewall sono corrette). In questo esempio siamo nel primo scenario descritto precedentemente; ora proveremo a connetterci con un client on-premise usando le librerie client di ADO.NET. Il codice che segue si connette al database su SQL Azure, crea un tabella sul database WilloPlayground ed esegue alcune istruzioni di inserimento e SELECT, mostrando i dati in una console. Il programma usa il tipo SqlConnectionStringBuilder per creare la stringa di connessione al database remoto e, come è facile constatare, non è per nulla differente rispetto ad un programma che accede a un database locale.
class Program { // Provide the following information private static string userName = "<qui va nome utente>"; private static string password = "<qui va password>"; private static string dataSource = "<nome server>.database.windows.net"; private static string sampleDatabaseName = "<nome database>"; static void Main(string[] args) { // Usa un oggetto SqlConnectionStringBuilder per costruire // la stringa di connessione al database SqlConnectionStringBuilder connStringBuilder; connStringBuilder = new SqlConnectionStringBuilder(); connStringBuilder.DataSource = dataSource; connStringBuilder.InitialCatalog = sampleDatabaseName; connStringBuilder.Encrypt = true; connStringBuilder.TrustServerCertificate = false; connStringBuilder.UserID = userName; connStringBuilder.Password = password; //fa un po' di operazioni sulla tabella Greetings using (SqlConnection conn = new SqlConnection(connStringBuilder.ToString())) { using (SqlCommand command = conn.CreateCommand()) { conn.Open(); //Crea un tabella command.CommandText = "CREATE TABLE Greetings " + "(Col1 int primary key, Col2 varchar(20))"; command.ExecuteNonQuery(); // Inserisce dei record command.CommandText = "INSERT INTO Greetings (col1, col2) " + "values (1, 'Hello'), (2, ','), (3, 'World')"; int rowsAdded = command.ExecuteNonQuery(); //Estrae tutti i record dalla tabella greetings command.CommandText = "SELECT * FROM Greetings"; using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine("{0}: {1}", reader["Col1"].ToString().Trim(), reader["Col2"].ToString().Trim()); } } conn.Close(); } } Console.WriteLine("Press enter to continue..."); Console.ReadLine(); } }
L'utilizzo delle librerie client e delle istruzioni T-SQL sui database di SQL Azure presentano alcune limitazioni rispetto a quanto possibile su SQL Server 2008 R2. Iniziamo da T-SQL. Il T-SQL di Azure è un sottoinsieme del T-SQL di SQL Server 2008. La lista completa delle istruzioni non supportate è accessibile su MSDN ma sostanzialmente non sono supportate le seguenti funzionalità:
- CLR
- Service Broker
- Spatial data
- UDT
- Query e transazioni distribuite
- Mirroring
- Gestione dei filegroup
- Tabelle temporanee globali
- Operazioni di configurazione di SQL Server
Il resto delle operazioni sono supportate nella forma utilizzata in SQL Server 2008 o con una sintassi modificata.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare politiche di resiliency con Azure Container App
Eseguire una query su SQL Azure tramite un workflow di GitHub
Aggiornare a .NET 9 su Azure App Service
Utilizzare Model as a Service su Microsoft Azure
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Sostituire la GitHub Action di login su private registry
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Ottenere un token di accesso per una GitHub App
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
What's new in Azure Functions and Extensions
Sfruttare MQTT in cloud e in edge con Azure Event Grid
Utilizzare il trigger SQL con le Azure Function