SlideShare une entreprise Scribd logo
Avantages & Inconvénients
dvoituron@outlook.com
Denis VOITURON – Principal .NET Architect
@DenisVoituronwww.dvoituron.com
2007
Principal Microsoft .NET Architect chez Trasys / NRB
Denis Voituron
1995
Ingénieur Civil (Mons – Belgique)
1999
Fondateur d’une société spécialisée dans les CMS
dvoituron@outlook.com
@DenisVoituron
https://www.dvoituron.com
2015
Créateur et animateur du podcast DevApps.be
Agenda
Concepts
Historique
SQL Server
Azure
Sécurité
Hello World (démo)
Fonction Scalaire
Fonction Table
Déploiements
Déclencheur (Trigger)
Fonction d’agrégation
Avantages & Inconvénients
Concepts
Qu’est ce que SQL CLR ?
Intégration du moteur d’exécution .NET dans SQL Server
• Intégration de la machine virtuelle du Framework .NET :
Common Language Runtime (CLR).
• Mise à disposition de fonctionnalités de développement riches
et hébergées par SQL Server.
• La couche d'hébergement coordonne les chargements des
assemblies (DLL), les tâches (Threads), la mémoire, la sécurité,
le contexte d'exécution, etc.
• Propose de nouvelles fonctionnalités sécurisées
(contrairement aux Extended Stored Procedures – xp)
SQL Engine
Windows
SQL OS
Hosting Layer
CLR
Disponible depuis SQL Server 2005
Pas (encore) dans Azure SQL Database  SQL Server dans une VM Azure
SQL CLR et Azure
SQL CLR et Azure
Le 19 avril 2017, Scott Guthrie a présenté Azure SQL Managed Instance
https://channel9.msdn.com/Events/Data-Science/Microsoft-Data-Amp-2017
Intégration du CLR dans SQL Server
SELECT value FROM sys.dm_clr_properties WHERE name = 'version'
Catégorie 2005 2008 2012 / 2014 / 2016
Supported .NET
Framework Libraries
CustomMarshalers
Microsoft.VisualBasic
Microsoft.VisualC
mscorlib
System
System.Configuration
System.Data
System.Data.OracleClient
System.Data.SqlXml
System.Deployment
System.Security
System.Transactions
System.Web.Services
System.Xml
+ System.Core
System.Xml.Linq
User-Defined Types
User-Defined Aggregates
Table-Valued Functions
Max 8000 bytes
Max 8000 bytes & 1 input parameter
No
Max 2 GB
Max 2 GB & 1 or more parameters
Yes
CLR Version 2.0 4.0
.NET Framework
Version
2.0 / 3.0 / 3.5 4.0 / 4.5 / 4.5.x
.NET Framework Version
Installed with SQL Server
2.0 3.5 SP1 4.0
Ref: http://www.sqlservercentral.com/articles/Stairway+Series/119429
Sécurité
Query Processor
SQL CLR Modules
(Stored Procedures, User-Defined Types / Aggregates, Table-Valued Functions, Triggers)
CLR Hosting Module (.NET Framework BCLs)
SQL Server
Database Engine
Database
SAFE
Native DLLs,
COM DLLs
UNSAFE
Files, Registry,
Network
EXTERNAL_ACCESS
SQL Query Results
Hello World
Activer les CLR
Par défaut, les CLR ne sont pas activées.
SqlContext est un object .NET qui donne accès aux composants
• IsAvailable - Détermine si le contexte est disponible.
• WindowsIdentity - Récupère l’identité de l’appelant.
• SqlTriggerContext - Fournit des informations sur le déclencheur qui a été activé.
• SqlPipe - Canal pour envoyer des messages ou des résultats.
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
Créer une fonction CLR “Scalaire”
[SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool ComparableTo(string source, string target)
{
return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()),
new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()),
CultureInfo.InvariantCulture,
CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0;
}
CREATE ASSEMBLY [MyLibrary]
FROM 'C:MyLibrary.dll'
WITH PERMISSION_SET = SAFE
CREATE FUNCTION [ComparableTo] (@source NVARCHAR(MAX), @target NVARCHAR(MAX))
RETURNS BIT
AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[ComparableTo];
SELECT dbo.ComparableTo('Van Deput va à l''école', 'Vandeput va a l''ecole ')
Déployer dans SQL Server
Utilisation de SqlClrDeployment https://github.com/Apps72/Dev.SqlClrDeployement
SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)ProjectsV12;Database=Scott;"
SqlClrDeployment MyLibrary.dll –output=MonScript.sql
Créer une fonction CLR “Table”
public static IEnumerable GetTable()
{
public class MyData
{
public int Id { get; set; }
public DateTime HireDate { get; set; }
}
var connection = new SqlConnection("context connection=true");
connection.Open();
using (var adapter = new SqlDataAdapter(" SELECT EMPNO AS ID, HIREDATE FROM EMP ", connection))
{
var data = new DataTable();
adapter.Fill(data);
}
var result = new List<MyData>();
foreach (DataRow row in data.Rows)
{
result.Add(new MyData()
{
Id = Convert.ToInt32(row["ID"]),
HireDate = Convert.ToDateTime(row["HIREDATE"])
});
}
return result;
Créer une fonction CLR “Table”
public static IEnumerable GetTable()
{
using (var cmd = new SqlDatabaseCommand(SqlDatabaseCommand.GetContextConnection()))
{
cmd.CommandText.AppendLine(" SELECT EMPNO AS ID, HIREDATE FROM EMP ");
return cmd.ExecuteTable<MyData>();
}
}
Install-Package Apps72.Dev.Data.SqlServerClr
public class MyData
{
public int Id { get; set; }
public DateTime HireDate { get; set; }
public int Year
{
get { return DateTime.Today.Year - HireDate.Year; }
}
}
CREATE FUNCTION [GetTable] ()
RETURNS TABLE(ID INT, Year INT)
AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[GetTable];
Créer une fonction CLR “Table”
[SqlFunction(DataAccess = DataAccessKind.Read,
FillRowMethodName = "FillRow_Table",
TableDefinition = "ID INT, Year INT")]
public static IEnumerable GetTable()
{
using (var cmd = new SqlDatabaseCommand(SqlDatabaseCommand.GetContextConnection()))
{
cmd.CommandText.AppendLine(" SELECT EMPNO AS ID, HIREDATE FROM EMP ");
return cmd.ExecuteTable<MyData>();
}
}
private static void FillRow_Table(Object obj, out int id, out int year)
{
var item = (MyData)obj;
id = item.Id;
year = item.Year;
}
SELECT * FROM dbo.GetTable()
ID Year
7369 37
7499 36
Créer un déclencheur
[SqlTrigger(Target = "EMP", Event = "FOR INSERT, UPDATE")]
public static void EMP_Inserted()
{
string action = Enum.GetName(typeof(TriggerAction), SqlContext.TriggerContext.TriggerAction);
SqlContext.Pipe.Send($"{action} raised.");
}
CREATE TRIGGER [EMP_Inserted]
ON EMP FOR INSERT, UPDATE
AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[EMP_Inserted];
UPDATE EMP SET ENAME = 'SMITH' WHERE EMPNO = 7369
Update raised.
(1 row(s) affected)
Créer un fonction d’agrégation
[SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = -1)]
public struct StringJoin : IBinarySerialize
{
private List<string> values;
public void Init() {
values = new List<string>();
}
public void Accumulate(SqlString Value) {
values.Add(Value.IsNull ? string.Empty : Value.Value);
}
public void Merge(StringJoin Group) {
values.AddRange(Group.values);
}
public SqlString Terminate() {
values.Sort();
return new SqlString(string.Join("; ", values.ToArray()));
}
...
SELECT dbo.StringJoin(DNAME) FROM DEPT
ACCOUNTING; OPERATIONS; RESEARCH; SALES
Pourquoi ?
Quand utiliser SQL CLR ?
Utiliser...
• Performances
o Traitements ligne par ligne (forward only).
o Logique (trop) complexes pour le T-SQL.
o A la place des curseurs.
• Maintenance
o Gestion centralisée du code.
o Simplification des Unit Tests.
o Versionning des DLLs.
• Fonctionnalités
o Fonctionnalités importantes du .NET.
o Logique métier dépendant de tiers.
Ne pas utiliser...
• Si la fonctionnalité existe en T-SQL.
• Pour les commandes DML.
• Pour gérer uniquement des
données.
• Quand la base de données doit être
portable.
• Pour gérer la base sous forme
d’objets.
Conclusion
Références
• Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server)
http://www.sqlservercentral.com/articles/Stairway+Series/119429
• Top things developers should know about SQL Server
https://channel9.msdn.com/Blogs/dpeeast/Northeast-Roadshow-
Top-things-developers-should-know-about-SQL-Server-Part-1
• Professional SQL Server 2005 CLR Programming
https://www.amazon.com/dp/0470054034
• Introduction to SQL Server CLR Integration
https://docs.microsoft.com/en-
us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration
• SqlDatabaseCommand – CLR
https://www.nuget.org/packages/Apps72.Dev.Data.SqlServerClr
• SqlClrDeployment.exe
https://github.com/Apps72/Dev.SqlClrDeployement
Concepts
Hello World
(démo)
Avantages &
Inconvénients
THANK YOU
FOR ATTENDING
https://fr.slideshare.net/dvoituron
https://github.com/dvoituron
dvoituron@outlook.com
www.dvoituron.com
@DenisVoituron

Contenu connexe

Tendances

Spark dataframe
Spark dataframeSpark dataframe
Spark dataframe
Modern Data Stack France
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
Maya Medjdoub
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
Haytam EL YOUSSFI
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
ECAM Brussels Engineering School
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
ECAM Brussels Engineering School
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
Hugo Hamon
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
Abdoulaye Dieng
 
Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Amel Morchdi
 
Java uik-chap4-poo3
Java uik-chap4-poo3Java uik-chap4-poo3
Java uik-chap4-poo3Amel Morchdi
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Tarik Zakaria Benmerar
 
Clonage d'objets
Clonage d'objetsClonage d'objets
Clonage d'objets
MohammedElaminTebib
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
ECAM Brussels Engineering School
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
ECAM Brussels Engineering School
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
mohamed El babili
 
Design patterns
Design patternsDesign patterns
Design patterns
Dorra BARTAGUIZ
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
ECAM Brussels Engineering School
 
UML OCL : Liaison avecUML -- 24
UML OCL : Liaison avecUML -- 24UML OCL : Liaison avecUML -- 24
UML OCL : Liaison avecUML -- 24
megaplanet20
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
ECAM Brussels Engineering School
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soatSOAT
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5
Kristen Le Liboux
 

Tendances (20)

Spark dataframe
Spark dataframeSpark dataframe
Spark dataframe
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++Chapitre 2 poo classe objet c++
Chapitre 2 poo classe objet c++
 
Java uik-chap4-poo3
Java uik-chap4-poo3Java uik-chap4-poo3
Java uik-chap4-poo3
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
 
Clonage d'objets
Clonage d'objetsClonage d'objets
Clonage d'objets
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 
Algo poo ts
Algo poo tsAlgo poo ts
Algo poo ts
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
 
UML OCL : Liaison avecUML -- 24
UML OCL : Liaison avecUML -- 24UML OCL : Liaison avecUML -- 24
UML OCL : Liaison avecUML -- 24
 
Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...Développement informatique : Programmation fonctionnelle, décorateur et génér...
Développement informatique : Programmation fonctionnelle, décorateur et génér...
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5
 

Similaire à Procédures CLR pour SQL Server : avantages et inconvénients

Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbc
abderrahim marzouk
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
Microsoft
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
Korteby Farouk
 
PréSentation Qualoo Le Generateur De Code Java J2 Ee
PréSentation Qualoo   Le Generateur De Code Java J2 EePréSentation Qualoo   Le Generateur De Code Java J2 Ee
PréSentation Qualoo Le Generateur De Code Java J2 EeST informatique services
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
Franck SIMON
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8lyonjug
 
Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le Cloud
Tugdual Grall
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introOlivier Mallassi
 
nodejs vs vertx
nodejs vs vertxnodejs vs vertx
nodejs vs vertx
Quentin Apruzzese
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
Xavier MARIN
 
Softshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décorSoftshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décor
michaelmiguel2013
 
Softshake apiness l'envers du décor
Softshake apiness l'envers du décorSoftshake apiness l'envers du décor
Softshake apiness l'envers du décor
ApinessSA
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
Antoine Rey
 
1145709.ppt
1145709.ppt1145709.ppt
1145709.ppt
hashiramasenju65
 
Activity
ActivityActivity
Activitydido
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
Jean-Pierre Vincent
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
David Pilato
 

Similaire à Procédures CLR pour SQL Server : avantages et inconvénients (20)

Marzouk une introduction à jdbc
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbc
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
PréSentation Qualoo Le Generateur De Code Java J2 Ee
PréSentation Qualoo   Le Generateur De Code Java J2 EePréSentation Qualoo   Le Generateur De Code Java J2 Ee
PréSentation Qualoo Le Generateur De Code Java J2 Ee
 
Jdbc
JdbcJdbc
Jdbc
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8
 
Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le Cloud
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
 
nodejs vs vertx
nodejs vs vertxnodejs vs vertx
nodejs vs vertx
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Softshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décorSoftshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décor
 
Softshake apiness l'envers du décor
Softshake apiness l'envers du décorSoftshake apiness l'envers du décor
Softshake apiness l'envers du décor
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
 
1145709.ppt
1145709.ppt1145709.ppt
1145709.ppt
 
Activity
ActivityActivity
Activity
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Tour Horizont.Net
Tour Horizont.NetTour Horizont.Net
Tour Horizont.Net
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 

Plus de Denis Voituron

Go lean, Go green
Go lean, Go greenGo lean, Go green
Go lean, Go green
Denis Voituron
 
DevDay 2021 - Codez comme un ninja
DevDay 2021 - Codez comme un ninjaDevDay 2021 - Codez comme un ninja
DevDay 2021 - Codez comme un ninja
Denis Voituron
 
Azure DevOps Tests Plan
Azure DevOps Tests PlanAzure DevOps Tests Plan
Azure DevOps Tests Plan
Denis Voituron
 
.Net passé, présent et futur
.Net passé, présent et futur.Net passé, présent et futur
.Net passé, présent et futur
Denis Voituron
 
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
Denis Voituron
 
Azure Pipelines - Et si on arrêtait de mettre en production avec des Disquettes
Azure Pipelines - Et si on arrêtait de mettre en production avec des DisquettesAzure Pipelines - Et si on arrêtait de mettre en production avec des Disquettes
Azure Pipelines - Et si on arrêtait de mettre en production avec des Disquettes
Denis Voituron
 
GitHub et Microsoft Azure DevOps - Le mariage parfait
GitHub et Microsoft Azure DevOps - Le mariage parfaitGitHub et Microsoft Azure DevOps - Le mariage parfait
GitHub et Microsoft Azure DevOps - Le mariage parfait
Denis Voituron
 
Azure for Dev
Azure for DevAzure for Dev
Azure for Dev
Denis Voituron
 
DevDay 2018 - Blazor
DevDay 2018 - BlazorDevDay 2018 - Blazor
DevDay 2018 - Blazor
Denis Voituron
 
Les méthodes agiles dans TFS
Les méthodes agiles dans TFSLes méthodes agiles dans TFS
Les méthodes agiles dans TFS
Denis Voituron
 
Awareness Oniryx - Mai 2018
Awareness Oniryx - Mai 2018Awareness Oniryx - Mai 2018
Awareness Oniryx - Mai 2018
Denis Voituron
 
A la découverte de TypeScript
A la découverte de TypeScriptA la découverte de TypeScript
A la découverte de TypeScript
Denis Voituron
 
Le futur de .NET
Le futur de .NETLe futur de .NET
Le futur de .NET
Denis Voituron
 
Microsoft Experieces 2016 - Retour d’expériences sur TFS Online
Microsoft Experieces 2016 - Retour d’expériences sur TFS OnlineMicrosoft Experieces 2016 - Retour d’expériences sur TFS Online
Microsoft Experieces 2016 - Retour d’expériences sur TFS Online
Denis Voituron
 
Développer avec un Simple Object Mapping Toolkit pour SQL Server
Développer avec un Simple Object Mapping Toolkit pour SQL ServerDévelopper avec un Simple Object Mapping Toolkit pour SQL Server
Développer avec un Simple Object Mapping Toolkit pour SQL Server
Denis Voituron
 
Les cinq bonnes pratiques des Tests Unitaires dans un projet Agile
Les cinq bonnes pratiques des Tests Unitaires dans un projet AgileLes cinq bonnes pratiques des Tests Unitaires dans un projet Agile
Les cinq bonnes pratiques des Tests Unitaires dans un projet Agile
Denis Voituron
 
DevFM #20 : SqlDatabaseCommand, un Simple Object Mapping Toolkit
DevFM #20 : SqlDatabaseCommand, un Simple Object Mapping ToolkitDevFM #20 : SqlDatabaseCommand, un Simple Object Mapping Toolkit
DevFM #20 : SqlDatabaseCommand, un Simple Object Mapping Toolkit
Denis Voituron
 
Présentation et bonnes pratiques du pattern MVVM - MIC Belgique
Présentation et bonnes pratiques du pattern MVVM - MIC BelgiquePrésentation et bonnes pratiques du pattern MVVM - MIC Belgique
Présentation et bonnes pratiques du pattern MVVM - MIC Belgique
Denis Voituron
 
Presentation MIC SummerCamp 2015 WaterStock
Presentation MIC SummerCamp 2015 WaterStockPresentation MIC SummerCamp 2015 WaterStock
Presentation MIC SummerCamp 2015 WaterStock
Denis Voituron
 
Scrum Guide
Scrum GuideScrum Guide
Scrum Guide
Denis Voituron
 

Plus de Denis Voituron (20)

Go lean, Go green
Go lean, Go greenGo lean, Go green
Go lean, Go green
 
DevDay 2021 - Codez comme un ninja
DevDay 2021 - Codez comme un ninjaDevDay 2021 - Codez comme un ninja
DevDay 2021 - Codez comme un ninja
 
Azure DevOps Tests Plan
Azure DevOps Tests PlanAzure DevOps Tests Plan
Azure DevOps Tests Plan
 
.Net passé, présent et futur
.Net passé, présent et futur.Net passé, présent et futur
.Net passé, présent et futur
 
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
MIC QRS "JWT, la superstar pour sécuriser vos WebAPI"
 
Azure Pipelines - Et si on arrêtait de mettre en production avec des Disquettes
Azure Pipelines - Et si on arrêtait de mettre en production avec des DisquettesAzure Pipelines - Et si on arrêtait de mettre en production avec des Disquettes
Azure Pipelines - Et si on arrêtait de mettre en production avec des Disquettes
 
GitHub et Microsoft Azure DevOps - Le mariage parfait
GitHub et Microsoft Azure DevOps - Le mariage parfaitGitHub et Microsoft Azure DevOps - Le mariage parfait
GitHub et Microsoft Azure DevOps - Le mariage parfait
 
Azure for Dev
Azure for DevAzure for Dev
Azure for Dev
 
DevDay 2018 - Blazor
DevDay 2018 - BlazorDevDay 2018 - Blazor
DevDay 2018 - Blazor
 
Les méthodes agiles dans TFS
Les méthodes agiles dans TFSLes méthodes agiles dans TFS
Les méthodes agiles dans TFS
 
Awareness Oniryx - Mai 2018
Awareness Oniryx - Mai 2018Awareness Oniryx - Mai 2018
Awareness Oniryx - Mai 2018
 
A la découverte de TypeScript
A la découverte de TypeScriptA la découverte de TypeScript
A la découverte de TypeScript
 
Le futur de .NET
Le futur de .NETLe futur de .NET
Le futur de .NET
 
Microsoft Experieces 2016 - Retour d’expériences sur TFS Online
Microsoft Experieces 2016 - Retour d’expériences sur TFS OnlineMicrosoft Experieces 2016 - Retour d’expériences sur TFS Online
Microsoft Experieces 2016 - Retour d’expériences sur TFS Online
 
Développer avec un Simple Object Mapping Toolkit pour SQL Server
Développer avec un Simple Object Mapping Toolkit pour SQL ServerDévelopper avec un Simple Object Mapping Toolkit pour SQL Server
Développer avec un Simple Object Mapping Toolkit pour SQL Server
 
Les cinq bonnes pratiques des Tests Unitaires dans un projet Agile
Les cinq bonnes pratiques des Tests Unitaires dans un projet AgileLes cinq bonnes pratiques des Tests Unitaires dans un projet Agile
Les cinq bonnes pratiques des Tests Unitaires dans un projet Agile
 
DevFM #20 : SqlDatabaseCommand, un Simple Object Mapping Toolkit
DevFM #20 : SqlDatabaseCommand, un Simple Object Mapping ToolkitDevFM #20 : SqlDatabaseCommand, un Simple Object Mapping Toolkit
DevFM #20 : SqlDatabaseCommand, un Simple Object Mapping Toolkit
 
Présentation et bonnes pratiques du pattern MVVM - MIC Belgique
Présentation et bonnes pratiques du pattern MVVM - MIC BelgiquePrésentation et bonnes pratiques du pattern MVVM - MIC Belgique
Présentation et bonnes pratiques du pattern MVVM - MIC Belgique
 
Presentation MIC SummerCamp 2015 WaterStock
Presentation MIC SummerCamp 2015 WaterStockPresentation MIC SummerCamp 2015 WaterStock
Presentation MIC SummerCamp 2015 WaterStock
 
Scrum Guide
Scrum GuideScrum Guide
Scrum Guide
 

Procédures CLR pour SQL Server : avantages et inconvénients

  • 1. Avantages & Inconvénients dvoituron@outlook.com Denis VOITURON – Principal .NET Architect @DenisVoituronwww.dvoituron.com
  • 2. 2007 Principal Microsoft .NET Architect chez Trasys / NRB Denis Voituron 1995 Ingénieur Civil (Mons – Belgique) 1999 Fondateur d’une société spécialisée dans les CMS dvoituron@outlook.com @DenisVoituron https://www.dvoituron.com 2015 Créateur et animateur du podcast DevApps.be
  • 3. Agenda Concepts Historique SQL Server Azure Sécurité Hello World (démo) Fonction Scalaire Fonction Table Déploiements Déclencheur (Trigger) Fonction d’agrégation Avantages & Inconvénients
  • 5. Qu’est ce que SQL CLR ? Intégration du moteur d’exécution .NET dans SQL Server • Intégration de la machine virtuelle du Framework .NET : Common Language Runtime (CLR). • Mise à disposition de fonctionnalités de développement riches et hébergées par SQL Server. • La couche d'hébergement coordonne les chargements des assemblies (DLL), les tâches (Threads), la mémoire, la sécurité, le contexte d'exécution, etc. • Propose de nouvelles fonctionnalités sécurisées (contrairement aux Extended Stored Procedures – xp) SQL Engine Windows SQL OS Hosting Layer CLR Disponible depuis SQL Server 2005 Pas (encore) dans Azure SQL Database  SQL Server dans une VM Azure
  • 6. SQL CLR et Azure
  • 7. SQL CLR et Azure Le 19 avril 2017, Scott Guthrie a présenté Azure SQL Managed Instance https://channel9.msdn.com/Events/Data-Science/Microsoft-Data-Amp-2017
  • 8. Intégration du CLR dans SQL Server SELECT value FROM sys.dm_clr_properties WHERE name = 'version' Catégorie 2005 2008 2012 / 2014 / 2016 Supported .NET Framework Libraries CustomMarshalers Microsoft.VisualBasic Microsoft.VisualC mscorlib System System.Configuration System.Data System.Data.OracleClient System.Data.SqlXml System.Deployment System.Security System.Transactions System.Web.Services System.Xml + System.Core System.Xml.Linq User-Defined Types User-Defined Aggregates Table-Valued Functions Max 8000 bytes Max 8000 bytes & 1 input parameter No Max 2 GB Max 2 GB & 1 or more parameters Yes CLR Version 2.0 4.0 .NET Framework Version 2.0 / 3.0 / 3.5 4.0 / 4.5 / 4.5.x .NET Framework Version Installed with SQL Server 2.0 3.5 SP1 4.0 Ref: http://www.sqlservercentral.com/articles/Stairway+Series/119429
  • 9. Sécurité Query Processor SQL CLR Modules (Stored Procedures, User-Defined Types / Aggregates, Table-Valued Functions, Triggers) CLR Hosting Module (.NET Framework BCLs) SQL Server Database Engine Database SAFE Native DLLs, COM DLLs UNSAFE Files, Registry, Network EXTERNAL_ACCESS SQL Query Results
  • 11. Activer les CLR Par défaut, les CLR ne sont pas activées. SqlContext est un object .NET qui donne accès aux composants • IsAvailable - Détermine si le contexte est disponible. • WindowsIdentity - Récupère l’identité de l’appelant. • SqlTriggerContext - Fournit des informations sur le déclencheur qui a été activé. • SqlPipe - Canal pour envoyer des messages ou des résultats. sp_configure 'clr enabled', 1 GO RECONFIGURE GO
  • 12. Créer une fonction CLR “Scalaire” [SqlFunction(DataAccess = DataAccessKind.Read)] public static bool ComparableTo(string source, string target) { return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()), new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()), CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0; } CREATE ASSEMBLY [MyLibrary] FROM 'C:MyLibrary.dll' WITH PERMISSION_SET = SAFE CREATE FUNCTION [ComparableTo] (@source NVARCHAR(MAX), @target NVARCHAR(MAX)) RETURNS BIT AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[ComparableTo]; SELECT dbo.ComparableTo('Van Deput va à l''école', 'Vandeput va a l''ecole ')
  • 13. Déployer dans SQL Server Utilisation de SqlClrDeployment https://github.com/Apps72/Dev.SqlClrDeployement SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)ProjectsV12;Database=Scott;" SqlClrDeployment MyLibrary.dll –output=MonScript.sql
  • 14. Créer une fonction CLR “Table” public static IEnumerable GetTable() { public class MyData { public int Id { get; set; } public DateTime HireDate { get; set; } } var connection = new SqlConnection("context connection=true"); connection.Open(); using (var adapter = new SqlDataAdapter(" SELECT EMPNO AS ID, HIREDATE FROM EMP ", connection)) { var data = new DataTable(); adapter.Fill(data); } var result = new List<MyData>(); foreach (DataRow row in data.Rows) { result.Add(new MyData() { Id = Convert.ToInt32(row["ID"]), HireDate = Convert.ToDateTime(row["HIREDATE"]) }); } return result;
  • 15. Créer une fonction CLR “Table” public static IEnumerable GetTable() { using (var cmd = new SqlDatabaseCommand(SqlDatabaseCommand.GetContextConnection())) { cmd.CommandText.AppendLine(" SELECT EMPNO AS ID, HIREDATE FROM EMP "); return cmd.ExecuteTable<MyData>(); } } Install-Package Apps72.Dev.Data.SqlServerClr public class MyData { public int Id { get; set; } public DateTime HireDate { get; set; } public int Year { get { return DateTime.Today.Year - HireDate.Year; } } }
  • 16. CREATE FUNCTION [GetTable] () RETURNS TABLE(ID INT, Year INT) AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[GetTable]; Créer une fonction CLR “Table” [SqlFunction(DataAccess = DataAccessKind.Read, FillRowMethodName = "FillRow_Table", TableDefinition = "ID INT, Year INT")] public static IEnumerable GetTable() { using (var cmd = new SqlDatabaseCommand(SqlDatabaseCommand.GetContextConnection())) { cmd.CommandText.AppendLine(" SELECT EMPNO AS ID, HIREDATE FROM EMP "); return cmd.ExecuteTable<MyData>(); } } private static void FillRow_Table(Object obj, out int id, out int year) { var item = (MyData)obj; id = item.Id; year = item.Year; } SELECT * FROM dbo.GetTable() ID Year 7369 37 7499 36
  • 17. Créer un déclencheur [SqlTrigger(Target = "EMP", Event = "FOR INSERT, UPDATE")] public static void EMP_Inserted() { string action = Enum.GetName(typeof(TriggerAction), SqlContext.TriggerContext.TriggerAction); SqlContext.Pipe.Send($"{action} raised."); } CREATE TRIGGER [EMP_Inserted] ON EMP FOR INSERT, UPDATE AS EXTERNAL NAME [MyLibrary].[MyLibrary.MyClass].[EMP_Inserted]; UPDATE EMP SET ENAME = 'SMITH' WHERE EMPNO = 7369 Update raised. (1 row(s) affected)
  • 18. Créer un fonction d’agrégation [SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = -1)] public struct StringJoin : IBinarySerialize { private List<string> values; public void Init() { values = new List<string>(); } public void Accumulate(SqlString Value) { values.Add(Value.IsNull ? string.Empty : Value.Value); } public void Merge(StringJoin Group) { values.AddRange(Group.values); } public SqlString Terminate() { values.Sort(); return new SqlString(string.Join("; ", values.ToArray())); } ... SELECT dbo.StringJoin(DNAME) FROM DEPT ACCOUNTING; OPERATIONS; RESEARCH; SALES
  • 20. Quand utiliser SQL CLR ? Utiliser... • Performances o Traitements ligne par ligne (forward only). o Logique (trop) complexes pour le T-SQL. o A la place des curseurs. • Maintenance o Gestion centralisée du code. o Simplification des Unit Tests. o Versionning des DLLs. • Fonctionnalités o Fonctionnalités importantes du .NET. o Logique métier dépendant de tiers. Ne pas utiliser... • Si la fonctionnalité existe en T-SQL. • Pour les commandes DML. • Pour gérer uniquement des données. • Quand la base de données doit être portable. • Pour gérer la base sous forme d’objets.
  • 22. Références • Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server) http://www.sqlservercentral.com/articles/Stairway+Series/119429 • Top things developers should know about SQL Server https://channel9.msdn.com/Blogs/dpeeast/Northeast-Roadshow- Top-things-developers-should-know-about-SQL-Server-Part-1 • Professional SQL Server 2005 CLR Programming https://www.amazon.com/dp/0470054034 • Introduction to SQL Server CLR Integration https://docs.microsoft.com/en- us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration • SqlDatabaseCommand – CLR https://www.nuget.org/packages/Apps72.Dev.Data.SqlServerClr • SqlClrDeployment.exe https://github.com/Apps72/Dev.SqlClrDeployement Concepts Hello World (démo) Avantages & Inconvénients

Notes de l'éditeur

  1. Ouvrir Visual Studio Créer un nouveau projet de type Class Library avec le nom MyLibrary Ecrire le code suivant using System; using System.Linq; using Microsoft.SqlServer.Server; using System.Globalization; namespace MyLibrary { public class MyClass { [SqlFunction(DataAccess = DataAccessKind.Read)] public static bool ComparableTo(string source, string target) { return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()), new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()), CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0; } } } Compiler et déployer via SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)\ProjectsV12;Database=Scott;”
  2. Ouvrir Visual Studio Créer un nouveau projet de type Class Library avec le nom MyLibrary Ecrire le code suivant using System; using System.Linq; using Microsoft.SqlServer.Server; using System.Globalization; namespace MyLibrary { public class MyClass { [SqlFunction(DataAccess = DataAccessKind.Read)] public static bool ComparableTo(string source, string target) { return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()), new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()), CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0; } } } Compiler et déployer via SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)\ProjectsV12;Database=Scott;”
  3. Ouvrir Visual Studio Créer un nouveau projet de type Class Library avec le nom MyLibrary Ecrire le code suivant using System; using System.Linq; using Microsoft.SqlServer.Server; using System.Globalization; namespace MyLibrary { public class MyClass { [SqlFunction(DataAccess = DataAccessKind.Read)] public static bool ComparableTo(string source, string target) { return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()), new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()), CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0; } } } Compiler et déployer via SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)\ProjectsV12;Database=Scott;”
  4. Ouvrir Visual Studio Créer un nouveau projet de type Class Library avec le nom MyLibrary Ecrire le code suivant using System; using System.Linq; using Microsoft.SqlServer.Server; using System.Globalization; namespace MyLibrary { public class MyClass { [SqlFunction(DataAccess = DataAccessKind.Read)] public static bool ComparableTo(string source, string target) { return String.Compare(new string(source.Where(c => char.IsLetterOrDigit(c)).ToArray()), new string(target.Where(c => char.IsLetterOrDigit(c)).ToArray()), CultureInfo.InvariantCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0; } } } Compiler et déployer via SqlClrDeployment MyLibrary.dll -cs="Server=(localdb)\ProjectsV12;Database=Scott;”