Introduction
Avec la version 12.5, l’accès aux fichiers est implémenté avec les CIS
(Component Integration Services) de Sybase. Cette technologie simplifie
grandement les opérations de transvasement de données entre des fichiers et des
tables (opérations bulk copy bcp
).
Paramètres de configuration
Deux paramètres de configuration au sein du serveur doivent être appliqués pour pouvoir mettre en œuvre l’accès aux fichiers à partir du moteur Sybase.
enable cis
(paramètre dynamique : 1 par défaut).enable file access
(paramètre dynamique : 0 par défaut).
Les services CIS (Component Integration Services) doivent être activés, ces derniers l’étant par défaut avec Sybase 12.5. Si ce n’est pas le cas
execute sp_configure 'enable cis',1
go
Pour accéder aux fichiers, le paramètre 'enable file access
' doit être
activé. Par défaut ce paramètre n’est pas activé :
execute sp_configure 'enable file access',1
go
Sécurité
Seuls les utilisateurs disposant du rôle sa_role
ou sso_role
sont autorisés
à créer des tables proxy reposant sur des fichiers. Le moteur Sybase doit être
autorisé à créer des fichiers dans le répertoire de destination.
Tables proxy reposant sur des fichiers système - Généralités
Lorsqu’une table proxy fait référence à un fichier :
- Le fichier ne doit pas être un répertoire, un bloc spécial ou un fichier contenant des caractères spéciaux.
- Le moteur Adaptive Server doit au moins avoir un droit de lecture sur le fichier. Si le fichier doit être créé, le droit d’écriture doit également être donné.
- Le contenu d’un fichier existant doit être lisible.
- Les enregistrements dans le fichier doivent être délimités par un caractère de nouvelle ligne \n.
- La taille maximale d’un enregistrement ne peut excéder 32767 octets.
- Les colonnes individuelles, sauf pour la dernière, sont délimitées par une chaîne qui ne peut excéder 16 octets : la chaîne de séparation est par défaut la tabulation.
- Il doit exister une correspondance pour chaque enregistrement entre les valeurs délimitées dans le fichier et les colonnes dans la table proxy.
Tables proxy créées avec la commande create proxy_table
Avec la commande create proxy_table
, une table proxy avec une colonne nommée
record de type varchar(255) est créée. Dans ce cas, le fichier doit contenir
des caractères lisibles et les lignes sont séparées par le caractère de retour
chariot \n
. Si le fichier n’existe pas, le moteur ASE tente de le créer.
Syntaxe :
create proxy_table <table_name>
external file at 'pathname'
La commande drop table
sur une table proxy faisant référence à un fichier ne
supprime pas le fichier associé.
Exemple :
create proxy_table recordlogs
external file at '/sdata/sybase/v12.5/TST_T1_ASE/files/recordlogs.txt'
La procédure sp_help
indique bien que cette table ne contient qu’une seule
colonne ayant le nom record de type varchar(255) et précise bien la
localisation du fichier externe correspondant.
exec sp_help recordlogs go
Object is Remote/External ------------------------- /sdata/sybase/v12.5/TST_T1_ASE/files/recordlogs.txt Name Owner Object_type ---- ----- ----------- recordlogs dbo user table Data_located_on_segment When_created ----------------------- ------------ default Nov 26 2004 5:25PM Column_name Type Length ... ----------- ---- ----------- ... record varchar 255 ...
Insertions et troncatures
La commande insert
peut alors être utilisée pour insérer des lignes à la fin
du fichier :
declare @datestring varchar(20)
select @datestring = convert(varchar(20),getdate())
insert into recordlogs values (@datestring + ' : query processing')
Pour vider le fichier, utiliser la commande truncate table
:
truncate table recordlogs
Les commandes update
et delete
ne sont pas autorisées sur les tables
proxy.
Interrogation
De simples interrogations peuvent être alors réalisées sur le fichier avec
la commande SELECT
:
select record from recordlogs where record like '%query%'
record ------ Nov 26 2004 5:37PM : query processing
Tables proxy créées avec la commande create existing table
Il est possible de spécifier des colonnes avec des types de données pour une table proxy faisant référence à un fichier contenant des enregistrements avec des valeurs délimitées. Syntaxe :
create existing table <table_name> (
column1 int null,
column2 datetime null,
column3 varchar(1024) null,
…
…
) external file at 'pathname' [column delimiter '<string>']
Par défaut le délimiteur de colonnes est une tabulation.
Les colonnes peuvent avoir n’importe quel type de données excepté les types
image
, text
et Java ADT
.
Si le fichier n’existe pas, ce dernier est créé par le moteur. Si le fichier existe, les données dans le fichier sont écrasées.
Exemple :
create existing table authors_bcp(
au_id id not null ,
au_lname varchar(40) not null ,
au_fname varchar(20) not null ,
phone char(12) not null ,
address varchar(40) null ,
city varchar(20) null ,
state char(2) null ,
country varchar(12) null ,
postalcode char(10) null
)
external file at '/sdata/sybase/v12.5/TST_T1_ASE/files/authors.txt' column delimiter ';'
Avec les tables proxy reposant sur des fichiers :
- Les tables peuvent être sauvegardées dans des fichiers texte en utilisant
les commandes
select/into
ouinsert/select
. Lorsqu’une commandeinsert
est exécutée, chaque colonne est transformée en caractères dans le jeu de caractères par défaut du serveur. Les résultats sont mis en buffer et toutes les colonnes exceptées la dernière sont séparées par le délimiteur. La dernière colonne est terminée par le caractère de fin de ligne\n
. Le buffer est ensuite écrit dans le fichier, représentant ainsi une ligne de données dans le fichier. - Ce procédé fournit une alternative SQL aux procédés
bcp in
,bcp out
pour décharger le contenu d’une table dans un fichier ou transvaser le contenu d’un fichier dans une table.
Déchargement des données d’une table dans un fichier
Les tables proxy facilitent le déchargement du contenu des données d’une table dans un fichier :
insert into authors_bcp select * from authors
----- Contenu du fichier : /sdata/sybase/v12.5/TST_T1_ASE/files/authors.txt 172-32-1176;White;Johnson;408 496-7223;10932 Bigge Rd.;MenloPark;CA;USA;94025 213-46-8915;Green;Marjorie;415 986-7020;309 63rd St.#411;Oakland;CA;USA;94618 238-95-7766;Carson;Cheryl;415 548-7723;589 Darwin Ln.;Berkeley;CA;USA;94705 ...
Insertion des données d’un fichier dans une table
Les tables proxy permettent d’insérer simplement les données d’un fichier texte dans une table :
select * into authors2 from authors where 1=2
go
insert into authors2
select * from authors_bcp
go
Interrogation
De simples interrogations peuvent être alors réalisées sur le fichier avec la commande SELECT grâce à la table proxy :
select au_id from authors_bcp where au_lname like 'Wh%'
172-32-1176
Troncature d’un fichier
La commande truncate table
sur une table proxy faisant référence à un
fichier système vide le contenu du fichier
truncate table <proxy_table>
Trace flag 11206
Le trace flag 11206 consigne dans le fichier de log du serveur les opérations liées aux tables proxy reposant sur des fichiers externes :
dbcc traceon(11206)
go
Le traceflag 11206 montre notamment que lors des interrogations, tous les enregistrements dans le fichier sont lus, donc il est nécessaire de prendre garde à la volumétrie du fichier.
Exemple de lecture :
select au_id from authors_bcp where au_lname like 'Wh%'
00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: startscan (/sdata/sybase/v12.5/TST_T1_ASE/files/authors.txt), fdes 0, sdes 0x206a2a70 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: getnext (/sdata/sybase/v12.5/TST_T1_ASE/files/authors.txt), fdes 0, offset 0 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: converting '172-32-1176' to type 'VARCHAR'; src len 11 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: converting 'White' to type 'VARCHAR'; src len 5 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: getnext (/sdata/sybase/v12.5/TST_T1_ASE/files/authors.txt), fdes 0, offset 79 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: converting '213-46-8915' to type 'VARCHAR'; src len 11 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: converting 'Green' to type 'VARCHAR'; src len 5 ... 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: fil_getnext: ufread() returned no data. 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: endscan (/sdata/sybase/v12.5/TST_T1_ASE/files/authors.txt), fdes 0 00:00000:00019:2004/11/26 18:21:45.77 server FILEPRXY, spid 19: fil_closetable(/sdata/sybase/v12.5/TST_T1_ASE/files/authors.txt), fdes -1
Exemple d’écriture:
insert into recordlogs values ('ecriture')
00:00000:00020:2004/11/26 18:30:10.77 server FILEPRXY, spid 20: fil_insert: opened '/sdata/sybase/v12.5/TST_T1_ASE/files/recordlogs.txt', positioned at offset 1839 00:00000:00020:2004/11/26 18:30:10.80 server FILEPRXY, spid 20: inserted record of 9 bytes, beginning at offset 1839 00:00000:00020:2004/11/26 18:30:10.80 server FILEPRXY, spid 20: fil_closetable(/sdata/sybase/v12.5/TST_T1_ASE/files/recordlogs.txt), fdes 0
Exemple de troncature :
truncate table authors_bc
00:00000:00020:2004/11/26 18:27:52.95 server FILEPRXY, spid 20: truncating file /sdata/sybase/v12.5/TST_T1_ASE/files/authors.txt