4D v13.4Implémentations du moteur SQL de 4D |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v13.4
Implémentations du moteur SQL de 4D
|
Type 4D SQL | Description | Type 4D |
Varchar | Texte aphanumérique | Texte ou Alpha |
Real | Nombre à virgule flottante compris dans l’intervalle +/1.7E308 | Réel |
Numeric | Nombre compris dans l’intervalle +/-2E64 | Entier 64 bits |
Float | Nombre à virgule flottante (virtuellement infini) | Float |
Smallint | Nombre compris entre -32 768 et 32 767 | Entier |
Int | Nombre compris entre -2 147 483 648 et 2 147 483 647 | Entier long, Entier |
Int64 | Nombre compris dans l’intervalle +/-2E64 | Entier 64 bits |
UUID | Nombre de 16 octets (128 bits) contenant 32 caractères hexadécimaux | Alpha format UUID |
Bit | Champ qui n’accepte que la valeur TRUE/FALSE ou 1/0 | Booléen |
Boolean | Champ qui n’accepte que la valeur TRUE/FALSE ou 1/0 | Booléen |
Blob | Jusqu’à 2 Go ; tout objet binaire tel qu’une image, un document, une application... | BLOB |
Bit varying | Jusqu’à 2 Go ; tout objet binaire tel qu’une image, un document, une application... | BLOB |
Clob | Jusqu’à 2 Go de texte. Ce type de colonne (champ) ne peut pas être indexé. Il n’est pas stocké dans l’enregistrement lui-même. | Texte |
Text | Jusqu’à 2 Go de texte. Ce type de colonne (champ) ne peut pas être indexé. Il n’est pas stocké dans l’enregistrement lui-même. | Texte |
Timestamp | Date sous la forme 'YYYY/MM/DD' et Heure sous la forme 'HH:MM:SS:ZZ' | Parties Date et Heure gérées séparément (conversion auto) |
Duration | Durée sous la forme 'HH:MM:SS:ZZ' | Heure |
Interval | Durée sous la forme 'HH:MM:SS:ZZ' | Heure |
Picture | Image PICT jusqu’à 2 Go | Image |
La conversion entre les types de données numériques est automatique. Les chaînes qui représentent un nombre ne sont pas converties en valeur numérique. L’opérateur de transtypage CAST permet de convertir des valeurs d’un type en un autre.
Les types de données SQL suivants ne sont pas implémentés :
La valeur NULL est implémentée dans le langage SQL de 4D ainsi que dans le moteur de base de données de 4D. En revanche, cette valeur n’existe pas dans le langage de 4D. Il est toutefois possible de lire et d’écrire la valeur NULL dans un champ 4D via les commandes Valeur champ Null et FIXER VALEUR CHAMP NULL.
Pour des raisons de compatibilité dans 4D, les valeurs NULL stockées dans les tables des bases de données 4D sont automatiquement converties en valeurs par défaut lors des manipulations effectuées via le langage de 4D. Par exemple, dans le cas de l’instruction suivante :
mavarAlpha:=[matable]MonChpAlpha
... si le champ MonchpAlpha contient la valeur NULL, la variable mavarAlpha contiendra “” (chaîne vide).
Les valeurs par défaut dépendent du type de données :
En revanche, ce mécanisme ne s’applique pas en principe aux traitements effectués au niveau du moteur de la base de données 4D, tels que les recherches. En effet, la recherche d’une valeur “vide” (par exemple mavaleur=0) ne trouvera pas les enregistrements stockant la valeur NULL, et inversement. Lorsque les deux types de valeurs (valeurs par défaut et NULL) cohabitent dans les enregistrements pour un même champ, certains traitements peuvent être faussés ou nécessiter du code supplémentaire.
Pour éviter ces désagréments, une option permet d’uniformiser tous les traitements dans le langage de 4D : Traduire les NULL en valeurs vides. Cette option, accessible dans l’Inspecteur des champs de l’éditeur de structure, permet d’étendre le principe d’usage des valeurs par défaut à tous les traitements. Les champs contenant la valeur NULL seront systématiquement considérés comme contenant la valeur par défaut. Cette option est cochée par défaut.
La propriété Traduire les NULL en valeurs vides est prise en compte à un niveau très bas du moteur de la base de données. Elle agit notamment sur la routine Valeur champ Null.
La propriété de champ Refuser l’écriture de la valeur NULL permet d’interdire le stockage de la valeur NULL :
Lorsque cet attribut est coché pour un champ, il ne sera pas possible de stocker la valeur NULL dans ce champ. Cette propriété de bas niveau correspond précisément à l’attribut NOT NULL du SQL.
De manière générale, si vous souhaitez pouvoir utiliser des valeurs NULL dans votre base de données 4D, il est conseillé d’utiliser exclusivement le langage SQL de 4D.
Note: Dans 4D, les champs peuvent également avoir l’attribut “Obligatoire”. Les deux notions sont proches mais leur portée est différente : l’attribut “Obligatoire” est un contrôle de saisie, tandis que l’attribut “Refuser l’écriture de la valeur NULL” agit au niveau du moteur de la base de données.
Si un champ disposant de cet attribut reçoit la valeur NULL, une erreur est générée.
La propriété "Disponible via SQL", disponible pour les méthodes projet, permet de contrôler l'exécution des méthodes projet de 4D via le SQL.
Lorsqu’elle est cochée, cette option autorise l’exécution de la méthode projet par le moteur SQL de 4D. Elle est désélectionnée par défaut, ce qui signifie que, sauf autorisation explicite, les méthodes projet de 4D sont protégées et peuvent pas être appelées par le moteur SQL de 4D.
Cette propriété s’applique à toutes les requêtes SQL internes et externes — exécutées via le driver ODBC, le code SQL inséré dans les balises Debut SQL/Fin SQL ou la commande CHERCHER PAR SQL.
Notes :
Note : Seules les bases locales interrogées par le moteur SQL de 4D sont affectées par ce paramètre. Dans le cas de connexions externes à d'autres bases SQL, le mécanisme d’auto-commit est pris en charge par les moteurs SQL distants.
4D implémente le concept de schémas. Un schéma est un objet virtuel contenant des tables de la base. Dans le SQL, le concept de schémas a pour but de permettre l’attribution de droits d’accès spécifiques à des ensembles d’objets de la base de données. Les schémas découpent la base en entités indépendantes dont l’assemblage représente la base entière. Autrement dit, une table appartient toujours à un et un seul schéma.
Note : Le contrôle des accès via les schémas s’applique uniquement aux connexions depuis l’extérieur. Le code SQL exécuté à l’intérieur de 4D via les balises Debut SQL/Fin SQL, SQL EXECUTER, CHERCHER PAR SQL... dispose toujours d’un accès complet.
Le catalogue SQL de 4D comporte sept tables système, accessible à tout utilisateur SQL disposant des droits d’accès en lecture : _USER_TABLES, _USER_COLUMNS, _USER_INDEXES, _USER_CONSTRAINTS, _USER_IND_ COLUMNS, _USER _CONS_ COLUMNS et _USER_SCHEMAS.
Conformément aux usages dans le monde SQL, les tables système décrivent la structure de la base de données. Voici le descriptif de ces tables et de leurs champs :
_USER_TABLES | Décrit les tables utilisateurs de la base | |
TABLE_NAME | VARCHAR | Nom de table |
TEMPORARY | BOOLEAN | Vrai si la table est temporaire, faux sinon |
TABLE_ID | INT64 | Numéro de table |
SCHEMA_ID | INT32 | Numéro de schéma |
_USER_COLUMNS | Décrit les colonnes des tables utilisateurs de la base | |
TABLE_NAME | VARCHAR | Nom de table |
COLUMN_NAME | VARCHAR | Nom de colonne |
DATA_TYPE | INT32 | Type de colonne |
DATA_LENGTH | INT32 | Longueur de colonne |
NULLABLE | BOOLEAN | Vrai si la colonne accepte des valeurs NULL, faux sinon |
TABLE_ID | INT64 | Numéro de table |
COLUMN_ID | INT64 | Numéro de colonne |
AUTOGENERATE | BOOLEAN | Vrai si la valeur de la colonne est automatiquement générée, Faux sinon |
AUTOINCREMENT | BOOLEAN | Vrai si la valeur de la colonne est automatiquement incrémentée, Faux sinon |
_USER_INDEXES | Décrit les index utilisateurs de la base | |
INDEX_ID | VARCHAR | Numéro d’index |
INDEX_NAME | VARCHAR | Nom d’index |
INDEX_TYPE | INT32 | Type d’index (1=BTree / Composite, 3=Cluster / Mots-clés, 7=Auto) |
TABLE_NAME | VARCHAR | Nom de table avec index |
UNIQUENESS | BOOLEAN | Vrai si l’index impose une contrainte d’unicité, faux sinon |
TABLE_ID | INT64 | Numéro de table avec index |
_USER_IND_COLUMNS | Décrit les colonnes des index utilisateurs de la base | |
INDEX_ID | VARCHAR | Numéro d’index |
INDEX_NAME | VARCHAR | Nom d’index |
TABLE_NAME | VARCHAR | Nom de table avec index |
COLUMN_NAME | VARCHAR | Nom de colonne avec index |
COLUMN_POSITION | INT32 | Position de colonne dans l’index |
TABLE_ID | INT64 | Numéro de table avec index |
COLUMN_ID | INT64 | Numéro de colonne |
_USER_CONSTRAINTS | Décrit les contraintes d'intégrité de la base | |
CONSTRAINT_ID | VARCHAR | Numéro de contrainte |
CONSTRAINT_NAME | VARCHAR | Nom de la définition de contrainte |
CONSTRAINT_TYPE | VARCHAR | Type de contrainte (P=clé primaire, R=intégrité référentielle - clé étrangère, 4DR=relation 4D) |
TABLE_NAME | VARCHAR | Nom de table avec contrainte |
TABLE_ID | INT64 | Numéro de table avec contrainte |
DELETE_RULE | VARCHAR | Règle de suppression de la contrainte – CASCADE ou RESTRICT |
RELATED_TABLE_NAME | VARCHAR | Nom de table liée |
RELATED_TABLE_ID | INT64 | Numéro de table liée |
_USER_CONS_COLUMNS | Décrit les colonnes des contraintes utilisateurs de la base | |
CONSTRAINT_ID | VARCHAR | Numéro de contrainte |
CONSTRAINT_NAME | VARCHAR | Nom de contrainte |
TABLE_NAME | VARCHAR | Nom de table avec contrainte |
TABLE_ID | INT64 | Numéro de table avec contrainte |
COLUMN_NAME | VARCHAR | Nom de colonne avec contrainte |
COLUMN_ID | INT64 | Numéro de colonne avec contrainte |
COLUMN_POSITION | INT32 | Position de colonne dans une contrainte |
RELATED_COLUMN_NAME | VARCHAR | Nom de colonne liée dans une contrainte |
RELATED_COLUMN_ID | INT32 | Numéro de colonne liée dans une contrainte |
_USER_SCHEMAS | Décrit les schémas de la base | |
SCHEMA_ID | INT32 | Numéro de schéma |
SCHEMA_NAME | VARCHAR | Nom de schéma |
READ_GROUP_ID | INT32 | Numéro du groupe ayant accès en lecture |
READ_GROUP_NAME | VARCHAR | Nom du groupe ayant accès en lecture |
READ_WRITE_GROUP_ID | INT32 | Numéro du groupe ayant accès en lecture-écriture |
READ_WRITE_GROUP_NAME | VARCHAR | Nom du groupe ayant accès en lecture-écriture |
ALL_GROUP_ID | INT32 | Numéro du groupe ayant un accès complet |
ALL_GROUP_NAME | VARCHAR | Nom du groupe ayant un accès complet |
Note : Les tables système sont affectées à un schéma particulier nommé SYSTEM_SCHEMA. Ce schéma ne peut être ni modifié ni supprimé. Il n’apparaît pas dans la liste des schémas affichée dans l’Inspecteur de tables. Il est accessible en mode Lecture seulement à tout utilisateur.
L’architecture multi-bases est implémentée au niveau du serveur SQL de 4D. Depuis 4D, il est possible :
Dans le langage SQL, la clé primaire permet d’identifier dans une table la ou les colonnes (champs) chargée(s) de désigner de façon unique les enregistrements (lignes). La définition d’une clé primaire est notamment indispensable à la fonction de réplication des enregistrements d’une table de 4D (cf. section ).
4D vous permet de gérer la clé primaire d’une table de deux manières :
Vous pouvez définir une clé primaire (PRIMARY KEY) lors de la création d’une table (via la commande CREATE TABLE) ou de l’ajout ou de la modification d’une colonne (via la commande ALTER TABLE). La clé primaire est définie à l'aide de la clause PRIMARY KEY suivie du nom de la colonne ou d'une liste de colonnes. Pour plus d'informations, reportez-vous à la section .
4D vous permet de créer et de supprimer directement une clé primaire via le menu contextuel de l’éditeur de structure.
Pour créer une clé primaire :
Les champs inclus dans la clé primaire apparaissent alors soulignés dans l’éditeur et leur description SQL fait apparaître le mot-clé PRIMARY KEY.
Le ou les champ(s) appartenant à la clé primaire ne doivent pas comporter de valeurs dupliquées. Si des valeurs dupliquées existaient déjà dans les enregistrements de la table, une boîte de dialogue d’alerte vous le signale.
Note : La ou les colonne(s) appartenant à la clé primaire n’acceptent pas la valeur NULL.
Pour supprimer la clé primaire d’une table :
Produit : 4D
Thème : Utiliser le SQL dans 4D
Nom intl. : Principles for integrating 4D and the 4D SQL engine