Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/12/2011, 13h20   #1
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Par défaut FILESTREAM : Déplacer un fichier d'une table à une autre

Bonjour,

Je suis actuellement en train de travailler sur un projet perso de GED.

J'ai opté pour un stockage de mes documents dans une base SQL Server 2008 R2, en utilisant l'option FILESTREAM afin de séparer les documents des données.

Actuellement, j'ai la structure suivante :
Code :
1
2
3
4
5
6
7
8
 
CREATE TABLE dbo.document
(
	     id      uniqueidentifier ROWGUIDCOL  NOT NULL DEFAULT NEWSEQUENTIALID() constraint document_pk PRIMARY KEY clustered,
	     title      nvarchar     (256) NOT NULL,
	     extension      nvarchar     (10) NOT NULL,
	     doc      varbinary     (max) FILESTREAM  NOT NULL
) ON [PRIMARY] FILESTREAM_ON [MagicGED_FileStream]
J'aimerais historiser les versions d'un même document :
- quand j'ouvre un document, si je fais une modification, je souhaite que mon programme déplace l'ancienne version du document dans une table d'historisation
- puis remplace le document existant par le nouveau dans la table des documents

Et là, je me pose la question :
Puisque mon champ flagé FILESTREAM n'est qu'un pointeur vers un fichier physique sur le disque dur, pourquoi ne pas déplacer simplement le pointeur du fichier, plutôt que de devoir dupliquer le fichier, puis supprimer l'original.

Est-ce possible ? Comment ?

Sinon, quel architecture proposeriez-vous ?

En effet, mes documents ainsi stockés dans la table "document" sont indexés en fulltext. Je ne souhaite pas intégrer une notion de version dans cette table pour plusieurs raisons :
- Lors de mes recherches, je souhaite ne rechercher que dans les dernières versions : donc je serai obligé de faire des sous-requêtes avec des max() ou autres joyeusetés, sur une table pourtant déjà fortement sollicitée
- Puisque je ne veux pas faire de recherche dans l'historique, ça m'ennuie d'indexer les documents qui ne sont pas la dernière version
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 20h37   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 725
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 725
Points : 6 849
Points : 6 849
Il n'y a pas de mise à jour partielle avec FILESTREAM sur les fichiers. Un seul octect changé sur un fichier va créer une nouvelle version de fichier et déférencer l'ancien.

Le fichier sur disque sera alors supprimé ultérieurement par un garbage collector de la même manière que ceux qui existent en programmation pour supprimer les objets qui ne sont plus référencés et utilisés.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 06h27   #3
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 670
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 670
Points : 8 732
Points : 8 732
Bonjour,

Au passage, je peux comprendre que la colonne title soit au type nvarchar, puisque le nom des documents peut contenir des caractères non-latins.

Mais je ne crois pas qu'il existe des extensions de fichiers qui en comprennent.
Si tel est le cas, alors l'utilisation du type nvarcahr n'est pas justifiée et aurait dû être du varchar, voire même du char ...

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 13h07   #4
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
IFilter travaille avec un nvarchar(8) donc si, Microsoft aussi à prévu le cas :
http://technet.microsoft.com/en-us/l.../ms142499.aspx

En revanche, 8 caractères, je trouve ça court (moi j'avais prévu 10).

Et puis rien ne m'empêche, si je suis chinois ou arabe, de m'amuser à mettre un mot de ma langue comme extension à un fichier. Je ne pense pas que Windows sourcille dans ce cas.

Chose amusante, lorsque j'interroge le catalogue système pour regarder les extensions prises en charges... il y en a 2 qui font plus de 8 caractères de long : je me demande alors bien comment SQL Serveur peut gérer ça
Code :
1
2
3
 
.vsixlangpack
.vsixmanifest
Sinon, ok pour le coup de la modification : je pensais que dans la dossier FILESTREAM, c'était bêtement géré comme des fichiers classiques. Donc je conserve ma méthode actuelle.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h10.


 
 
 
 
Partenaires

Hébergement Web