<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - StringBuilder</title>
		<link>https://www.developpez.net/forums/blogs/351715-stringbuilder/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Thu, 09 Apr 2026 14:14:10 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - StringBuilder</title>
			<link>https://www.developpez.net/forums/blogs/351715-stringbuilder/</link>
		</image>
		<item>
			<title>Remodéliser votre base de données</title>
			<link>https://www.developpez.net/forums/blogs/351715-stringbuilder/b748/remodeliser-base-donnees/</link>
			<pubDate>Wed, 16 Sep 2015 08:16:46 GMT</pubDate>
			<description>Il arrive souvent que vous...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Il arrive souvent que vous soyez face à une base de données mal pensée à l'origine, et qui a mal évolué.<br />
Vous vous retrouvez avec des tables &quot;mamouth&quot;, au nombre incalculable de colonnes nulles.<br />
<br />
Le problème, c'est que de nombreux outils accèdent souvent à cette base de données, et qu'il vous semble insurmontable de devoir tout réécrire afin de réagencer quelques tables dans votre base.<br />
<br />
Pourtant, même si la tâche reste ardue, il n'est aucunement nécessaire de réécrire vos applications pour utiliser des tables dont vous aurez modifié la structure.<br />
En effet, la plupart des SGBD modernes permettent :<br />
<ul><li style="">de faire des vues</li><li style="">de faire du CRUD dessus</li><li style="">d'étendre les possibilités du CRUD sur les vues à l'aide de triggers positionnés directement sur les vues</li></ul><br />
<br />
Les exemple de cet article sont basés sur SQL Server. La syntaxe peut varier d'un SGBD à l'autre. Cet article n'a pas pour vocation de fournir des exemple s'adaptant à tous les SGBD, mais avant tout à proposer une méthodologie.<br />
<br />
Soit une base de données de contacts, très mal modélisée :<br />
<ul><li style="">Une seule table</li><li style="">Des colonnes nullables</li><li style="">Une sémantique redondante entre certaines colonnes</li></ul><br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">table</span> contact
<span class="br0">&#40;</span>
	id <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">primary</span> <span style="color: #0000ff;">key</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">identity</span>,
	nom <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">50</span><span class="br0">&#41;</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>,
	prenom <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">50</span><span class="br0">&#41;</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>,
	telephone_maison <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">10</span><span class="br0">&#41;</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">check</span> <span class="br0">&#40;</span>telephone_maison <span style="color: #0000ff;">like</span> replicate<span class="br0">&#40;</span><span style="color: #FF0000;">'[0-9]'</span>, <span style="color: #cc66cc;">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,
	telephone_mobile <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">10</span><span class="br0">&#41;</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">check</span> <span class="br0">&#40;</span>telephone_mobile <span style="color: #0000ff;">like</span> replicate<span class="br0">&#40;</span><span style="color: #FF0000;">'[0-9]'</span>, <span style="color: #cc66cc;">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,
	telephone_boulot <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">10</span><span class="br0">&#41;</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">check</span> <span class="br0">&#40;</span>telephone_boulot <span style="color: #0000ff;">like</span> replicate<span class="br0">&#40;</span><span style="color: #FF0000;">'[0-9]'</span>, <span style="color: #cc66cc;">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,
	<span style="color: #0000ff;">unique</span> <span class="br0">&#40;</span>nom, prenom<span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
On remarque tout de suite que la présente de 3 colonnes &quot;numéro de téléphone&quot;, nullables, est une aberration : en effet, si on souhaite rechercher une personne par un numéro de téléphone, il est impossible d'utiliser le moindre index. Et la présence de NULL dans une table, c'est la preuve d'une modélisation hasardeuse.<br />
<br />
On souhaite donc effectuer des recherches simples en saisissant un numéro de téléphone.<br />
La recherche doit alors retourner toutes les lignes de contact où l’un des trois numéros de téléphone est égal au numéro recherché.<br />
La table étant très mal modélisée, on a au départ tenté :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">select</span> *
<span style="color: #0000ff;">from</span> contact
<span style="color: #0000ff;">where</span> telephone_maison = <span style="color: #FF0000;">'0123456789'</span> <span style="color: #0000ff;">or</span> telephone_mobile = <span style="color: #FF0000;">'0123456789'</span> <span style="color: #0000ff;">or</span> telephone_boulot = <span style="color: #FF0000;">'0123456789'</span>;</pre></td></tr></table></pre>
</div><br />
Mais malgré la création d’index, cette requête est très lente (le OR est non sargable) et franchement pas très jolie. Surtout qu’on a pour objectif, d'ici quelques temps, d’ajouter un “telephone_conjoint”, donc il faudra modifier la requête, recréer des index.<br />
<br />
On a donc créé une vue permettant d’effectuer cette recherche plus facilement, et de façon plus performante (le union permet d'utilisation des index) :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">view</span> contact_telephone <span class="br0">&#40;</span>id, nom, prenom, type_telephone, numero_telephone<span class="br0">&#41;</span>
<span style="color: #0000ff;">as</span>
<span style="color: #0000ff;">select</span> id, nom, prenom, <span style="color: #FF0000;">'MAISON'</span>, telephone_maison
<span style="color: #0000ff;">from</span> contact
<span style="color: #0000ff;">union</span>
<span style="color: #0000ff;">select</span> id, nom, prenom, <span style="color: #FF0000;">'MOBILE'</span>, telephone_mobile
<span style="color: #0000ff;">from</span> contact
<span style="color: #0000ff;">union</span>
<span style="color: #0000ff;">select</span> id, nom, prenom, <span style="color: #FF0000;">'BOULOT'</span>, telephone_boulot
<span style="color: #0000ff;">from</span> contact;</pre></td></tr></table></pre>
</div><br />
Après mure réflexion, cette modélisation est parfaitement pourrie, et on souhaite l’améliorer.<br />
Les NULL polluent l'utilisation des index, rendent la maintenance des données difficile (dédoublonnage par exemple) : comment mettre en place une clause d'unicité portant sur trois colonnes et toutes les lignes d'une table ?<br />
<br />
Seulement, on a un programme qui permet de faire du CRUD sur la table “contact”, afin de remplir notre base de contacts.<br />
Et une autre application web, qui fait des recherches à l’aide de la vue “contact_telephone”, permettant aux utilisateur de trouver rapidement le contact à partir de son numéro.<br />
<br />
Ce programme étant écrit en COBOL, et son auteur étant parti à la retraite à l’époque où vous ne saviez même pas encore lire, vous préférez éviter d’avoir à le toucher, même si, à terme, vous serez certainement amenés à le remplacer.<br />
Quant au site web, c'est un stagiaire qui vous a fait ça en PHP entre deux parties de jeu vidéo, et vous n'osez pas vous approcher du code, tellement il est incompréhensible.<br />
<br />
Pourtant, vous n'allez pas abandonner. Vous pouvez rendre votre base de données propre et performante, en la remodélisant.<br />
<br />
Voici donc comment procéder.<br />
<br />
On va, dans un premier temps, créer les tables “propres”.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">table</span> personne
<span class="br0">&#40;</span>
	id <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">primary</span> <span style="color: #0000ff;">key</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">identity</span>,
	nom <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">50</span><span class="br0">&#41;</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>,
	prenom <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">50</span><span class="br0">&#41;</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>,
	<span style="color: #0000ff;">unique</span> <span class="br0">&#40;</span>nom, prenom<span class="br0">&#41;</span>
<span class="br0">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">table</span> telephone
<span class="br0">&#40;</span>
	id <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">primary</span> <span style="color: #0000ff;">key</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">identity</span>,
	personne_id <span style="color: #0000ff;">int</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">references</span> personne<span class="br0">&#40;</span>id<span class="br0">&#41;</span>,
	type_telephone <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">6</span><span class="br0">&#41;</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">check</span> <span class="br0">&#40;</span>type_telephone <span style="color: #0000ff;">in</span> <span class="br0">&#40;</span><span style="color: #FF0000;">'MAISON'</span>, <span style="color: #FF0000;">'MOBILE'</span>, <span style="color: #FF0000;">'BOULOT'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,
	numero_telephone <span style="color: #0000ff;">varchar</span><span class="br0">&#40;</span><span style="color: #cc66cc;">10</span><span class="br0">&#41;</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">check</span> <span class="br0">&#40;</span>numero_telephone <span style="color: #0000ff;">like</span> replicate<span class="br0">&#40;</span><span style="color: #FF0000;">'[0-9]'</span>, <span style="color: #cc66cc;">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Ce nouveau modèle des données est loin d'être parfait. Il faudrait notamment avoir une table &quot;type_telephone&quot; plutôt qu'une contrainte sur une colonne littérale. Il s'agit ici simplement d'un exemple.<br />
<br />
Puis recopier notre table poubelle dedans :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">set</span> identity_insert personne <span style="color: #0000ff;">on</span>;
<span style="color: #0000ff;">insert</span> <span style="color: #0000ff;">into</span> personne <span class="br0">&#40;</span>id, nom, prenom<span class="br0">&#41;</span>
<span style="color: #0000ff;">select</span> id, nom, prenom
<span style="color: #0000ff;">from</span> contact;
<span style="color: #0000ff;">set</span> identity_insert personne off;
&nbsp;
<span style="color: #0000ff;">insert</span> <span style="color: #0000ff;">into</span> telephone <span class="br0">&#40;</span>personne_id, type_telephone, numero_telephone<span class="br0">&#41;</span>
<span style="color: #0000ff;">select</span> id, type_telephone, numero_telephone
<span style="color: #0000ff;">from</span> contact_telephone
<span style="color: #0000ff;">where</span> numero_telephone <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>;</pre></td></tr></table></pre>
</div><br />
Et on va maintenant transformer la table poubelle en vue toute propre :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">drop</span> <span style="color: #0000ff;">table</span> contact;
<span style="color: #0000ff;">go</span>
&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">view</span> contact <span class="br0">&#40;</span>id, nom, prenom, telephone_maison, telephone_mobile, telephone_boulot<span class="br0">&#41;</span>
<span style="color: #0000ff;">as</span>
<span style="color: #0000ff;">select</span> p.id, p.nom, p.prenom, t1.numero_telephone, t2.numero_telephone, t3.numero_telephone
<span style="color: #0000ff;">from</span> personne p
<span style="color: #0000ff;">left</span> <span style="color: #0000ff;">outer</span> <span style="color: #0000ff;">join</span> telephone t1 <span style="color: #0000ff;">on</span> t1.personne_id = p.id <span style="color: #0000ff;">and</span> t1.type_telephone = <span style="color: #FF0000;">'MAISON'</span>
<span style="color: #0000ff;">left</span> <span style="color: #0000ff;">outer</span> <span style="color: #0000ff;">join</span> telephone t2 <span style="color: #0000ff;">on</span> t2.personne_id = p.id <span style="color: #0000ff;">and</span> t2.type_telephone = <span style="color: #FF0000;">'MOBILE'</span>
<span style="color: #0000ff;">left</span> <span style="color: #0000ff;">outer</span> <span style="color: #0000ff;">join</span> telephone t3 <span style="color: #0000ff;">on</span> t3.personne_id = p.id <span style="color: #0000ff;">and</span> t3.type_telephone = <span style="color: #FF0000;">'BUREAU'</span>;
<span style="color: #0000ff;">go</span></pre></td></tr></table></pre>
</div><br />
Seul hic, si on tente de créer/modifier/supprimer des lignes, ça ne fait pas trop ce qu’on veut :<br />
<br />
Lorsqu'on tente d'enregistrer un nouveau contact :<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Msg 4405, Level 16, State 1, Line 75<br />
View or function 'contact' is not updatable because the modification affects multiple base tables.
			
		</div>
	</div>
</div>Lorsqu’on tente de mettre à jour un numéro de téléphone existant :<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				(0 row(s) affected)
			
		</div>
	</div>
</div>Lorsqu'on tente de supprimer un contact :<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				Msg 4405, Level 16, State 1, Line 79<br />
View or function 'contact' is not updatable because the modification affects multiple base tables.
			
		</div>
	</div>
</div>On va donc devoir créer quelques triggers pour gérer correctement les différents cas :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">trigger</span> trg_contact_ins
<span style="color: #0000ff;">on</span> contact
instead <span style="color: #0000ff;">of</span> <span style="color: #0000ff;">insert</span>
<span style="color: #0000ff;">as</span>
<span style="color: #0000ff;">begin</span>
	<span style="color: #0000ff;">insert</span> <span style="color: #0000ff;">into</span> personne <span class="br0">&#40;</span>nom, prenom<span class="br0">&#41;</span>
	<span style="color: #0000ff;">select</span> nom, prenom
	<span style="color: #0000ff;">from</span> inserted;
&nbsp;
	<span style="color: #0000ff;">insert</span> <span style="color: #0000ff;">into</span> telephone <span class="br0">&#40;</span>personne_id, type_telephone, numero_telephone<span class="br0">&#41;</span>
	<span style="color: #0000ff;">select</span> personne.id, <span style="color: #FF0000;">'MAISON'</span>, inserted.telephone_maison
	<span style="color: #0000ff;">from</span> inserted
	<span style="color: #0000ff;">inner</span> <span style="color: #0000ff;">join</span> personne <span style="color: #0000ff;">on</span> personne.nom = inserted.nom <span style="color: #0000ff;">and</span> personne.prenom = inserted.prenom
	<span style="color: #0000ff;">where</span> telephone_maison <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>
	<span style="color: #0000ff;">union</span>
	<span style="color: #0000ff;">select</span> personne.id, <span style="color: #FF0000;">'MOBILE'</span>, inserted.telephone_mobile
	<span style="color: #0000ff;">from</span> inserted
	<span style="color: #0000ff;">inner</span> <span style="color: #0000ff;">join</span> personne <span style="color: #0000ff;">on</span> personne.nom = inserted.nom <span style="color: #0000ff;">and</span> personne.prenom = inserted.prenom
	<span style="color: #0000ff;">where</span> telephone_mobile <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>
	<span style="color: #0000ff;">union</span>
	<span style="color: #0000ff;">select</span> personne.id, <span style="color: #FF0000;">'BOULOT'</span>, inserted.telephone_boulot
	<span style="color: #0000ff;">from</span> inserted
	<span style="color: #0000ff;">inner</span> <span style="color: #0000ff;">join</span> personne <span style="color: #0000ff;">on</span> personne.nom = inserted.nom <span style="color: #0000ff;">and</span> personne.prenom = inserted.prenom
	<span style="color: #0000ff;">where</span> telephone_boulot <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>;
<span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">go</span>
&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">trigger</span> trg_contact_del
<span style="color: #0000ff;">on</span> contact
instead <span style="color: #0000ff;">of</span> <span style="color: #0000ff;">delete</span>
<span style="color: #0000ff;">as</span>
<span style="color: #0000ff;">begin</span>
	<span style="color: #0000ff;">delete</span> telephone <span style="color: #0000ff;">where</span> personne_id <span style="color: #0000ff;">in</span> <span class="br0">&#40;</span><span style="color: #0000ff;">select</span> id <span style="color: #0000ff;">from</span> deleted<span class="br0">&#41;</span>;
	<span style="color: #0000ff;">delete</span> personne <span style="color: #0000ff;">where</span> id <span style="color: #0000ff;">in</span> <span class="br0">&#40;</span><span style="color: #0000ff;">select</span> id <span style="color: #0000ff;">from</span> deleted<span class="br0">&#41;</span>;
<span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">go</span>
&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">trigger</span> trg_contact_upd
<span style="color: #0000ff;">on</span> contact
instead <span style="color: #0000ff;">of</span> <span style="color: #0000ff;">update</span>
<span style="color: #0000ff;">as</span>
<span style="color: #0000ff;">begin</span>
	<span style="color: #0000ff;">update</span> personne
	<span style="color: #0000ff;">set</span> nom = i.nom, prenom = i.prenom
	<span style="color: #0000ff;">from</span> inserted i
	<span style="color: #0000ff;">where</span> personne.id = i.id <span style="color: #0000ff;">and</span> <span class="br0">&#40;</span>personne.nom &lt;&gt; i.nom <span style="color: #0000ff;">or</span> personne.prenom &lt;&gt; i.prenom<span class="br0">&#41;</span>;
&nbsp;
	<span style="color: #0000ff;">insert</span> <span style="color: #0000ff;">into</span> telephone <span class="br0">&#40;</span>personne_id, type_telephone, numero_telephone<span class="br0">&#41;</span>
	<span style="color: #0000ff;">select</span> i.id, <span style="color: #FF0000;">'MAISON'</span>, i.telephone_maison <span style="color: #0000ff;">from</span> inserted i <span style="color: #0000ff;">left</span> <span style="color: #0000ff;">outer</span> <span style="color: #0000ff;">join</span> deleted d <span style="color: #0000ff;">on</span> d.id = i.id <span style="color: #0000ff;">where</span> d.telephone_maison <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> i.telephone_maison <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>
	<span style="color: #0000ff;">union</span>
	<span style="color: #0000ff;">select</span> i.id, <span style="color: #FF0000;">'MOBILE'</span>, i.telephone_mobile <span style="color: #0000ff;">from</span> inserted i <span style="color: #0000ff;">left</span> <span style="color: #0000ff;">outer</span> <span style="color: #0000ff;">join</span> deleted d <span style="color: #0000ff;">on</span> d.id = i.id <span style="color: #0000ff;">where</span> d.telephone_mobile <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> i.telephone_mobile <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>
	<span style="color: #0000ff;">union</span>
	<span style="color: #0000ff;">select</span> i.id, <span style="color: #FF0000;">'BOULOT'</span>, i.telephone_boulot <span style="color: #0000ff;">from</span> inserted i <span style="color: #0000ff;">left</span> <span style="color: #0000ff;">outer</span> <span style="color: #0000ff;">join</span> deleted d <span style="color: #0000ff;">on</span> d.id = i.id <span style="color: #0000ff;">where</span> d.telephone_boulot <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> i.telephone_boulot <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span>;
&nbsp;
	<span style="color: #0000ff;">update</span> telephone
	<span style="color: #0000ff;">set</span> numero_telephone = tmp.numero_telephone
	<span style="color: #0000ff;">from</span> <span class="br0">&#40;</span>
		<span style="color: #0000ff;">select</span> i.id personne_id, <span style="color: #FF0000;">'MAISON'</span> type_telephone, i.telephone_maison numero_telephone <span style="color: #0000ff;">from</span> inserted i <span style="color: #0000ff;">inner</span> <span style="color: #0000ff;">join</span> deleted d <span style="color: #0000ff;">on</span> d.id = i.id <span style="color: #0000ff;">where</span> d.telephone_maison &lt;&gt; i.telephone_maison
		<span style="color: #0000ff;">union</span>
		<span style="color: #0000ff;">select</span> i.id, <span style="color: #FF0000;">'MOBILE'</span>, i.telephone_mobile <span style="color: #0000ff;">from</span> inserted i <span style="color: #0000ff;">inner</span> <span style="color: #0000ff;">join</span> deleted d <span style="color: #0000ff;">on</span> d.id = i.id <span style="color: #0000ff;">where</span> d.telephone_mobile &lt;&gt; i.telephone_mobile
		<span style="color: #0000ff;">union</span>
		<span style="color: #0000ff;">select</span> i.id, <span style="color: #FF0000;">'BOULOT'</span>, i.telephone_boulot <span style="color: #0000ff;">from</span> inserted i <span style="color: #0000ff;">inner</span> <span style="color: #0000ff;">join</span> deleted d <span style="color: #0000ff;">on</span> d.id = i.id <span style="color: #0000ff;">where</span> d.telephone_boulot &lt;&gt; i.telephone_boulot
	<span class="br0">&#41;</span> tmp
	<span style="color: #0000ff;">where</span> telephone.personne_id = tmp.personne_id <span style="color: #0000ff;">and</span> telephone.type_telephone = tmp.type_telephone;
&nbsp;
	<span style="color: #0000ff;">delete</span> telephone
	<span style="color: #0000ff;">from</span> inserted
	<span style="color: #0000ff;">inner</span> <span style="color: #0000ff;">join</span> deleted <span style="color: #0000ff;">on</span> deleted.id = inserted.id
	<span style="color: #0000ff;">where</span> <span class="br0">&#40;</span>deleted.telephone_maison <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> inserted.telephone_maison <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> telephone.type_telephone = <span style="color: #FF0000;">'MAISON'</span><span class="br0">&#41;</span>
	<span style="color: #0000ff;">or</span> <span class="br0">&#40;</span>deleted.telephone_mobile <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> inserted.telephone_mobile <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> telephone.type_telephone = <span style="color: #FF0000;">'MOBILE'</span><span class="br0">&#41;</span>
	<span style="color: #0000ff;">or</span> <span class="br0">&#40;</span>deleted.telephone_boulot <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> inserted.telephone_boulot <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">null</span> <span style="color: #0000ff;">and</span> telephone.type_telephone = <span style="color: #FF0000;">'BOULOT'</span><span class="br0">&#41;</span>
<span style="color: #0000ff;">end</span>;
<span style="color: #0000ff;">go</span></pre></td></tr></table></pre>
</div><br />
Et enfin, la vue “contact_telephone” est réécrite, de façon très simple.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">drop</span> <span style="color: #0000ff;">view</span> contact_telephone;
<span style="color: #0000ff;">go</span>
&nbsp;
<span style="color: #0000ff;">create</span> <span style="color: #0000ff;">view</span> contact_telephone <span class="br0">&#40;</span>id, nom, prenom, type_telephone, numero_telephone<span class="br0">&#41;</span>
<span style="color: #0000ff;">as</span>
<span style="color: #0000ff;">with</span> type_telephone <span class="br0">&#40;</span>libelle<span class="br0">&#41;</span>
<span style="color: #0000ff;">as</span>
<span class="br0">&#40;</span>
	<span style="color: #0000ff;">select</span> <span style="color: #FF0000;">'MAISON'</span>
	<span style="color: #0000ff;">union</span> <span style="color: #0000ff;">all</span>
	<span style="color: #0000ff;">select</span> <span style="color: #FF0000;">'MOBILE'</span>
	<span style="color: #0000ff;">union</span> <span style="color: #0000ff;">all</span>
	<span style="color: #0000ff;">select</span> <span style="color: #FF0000;">'BOULOT'</span>
<span class="br0">&#41;</span>
<span style="color: #0000ff;">select</span> p.id, p.nom, p.prenom, type_telephone.libelle, t.numero_telephone
<span style="color: #0000ff;">from</span> personne p
<span style="color: #0000ff;">cross</span> <span style="color: #0000ff;">join</span> type_telephone
<span style="color: #0000ff;">left</span> <span style="color: #0000ff;">outer</span> <span style="color: #0000ff;">join</span> telephone t <span style="color: #0000ff;">on</span> t.personne_id = p.id <span style="color: #0000ff;">and</span> t.type_telephone = type_telephone.libelle;</pre></td></tr></table></pre>
</div><br />
Et voilà ! Maintenant, vos programmes existants travaillent dans une jolie base bien modélisée sans même s'en rendre compte !<br />
Et les performances, malgré la taille imposante des triggers, seront au rendez-vous, je vous le garanti !</blockquote>

]]></content:encoded>
			<dc:creator>StringBuilder</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/351715-stringbuilder/b748/remodeliser-base-donnees/</guid>
		</item>
	</channel>
</rss>
