par
Cyrano » 28 oct. 2005, 11:54
Avec SQL Server, le moins compliqué sera une procédure stockée. Je reprends ici les explications que j,ai dans un bouquin sur le SQL à ce propos.
"...nous construisons une table contenant la valeur de la dernière clé affectée à chacune des tables pour lesqe=uelles on veut ce calcul:
Code : Tout sélectionner
CREATE TABLE SYS_KEYS
(KEY_TABLE_NAME CHAR(128) NOT NULL PRIMARY KEY,
KEY_KEY_VALUE INTEGER NOT NULL DEFAULT 1)
"Avant toute insertion dans la base, on aura soin d'alimenter cette table avec le nom de toutes les tables qui demandent un tel calcul
Pour notre jeu d'essai, nous ferons la requête suivante :"
Code : Tout sélectionner
INSERT INTO SYS_KEYS
SELECT 'nom_table', MAX(champ_id) FROM nom_table
Note : le premier 'nom_table' de la sous-requête est ici une chaine de caractère.
"Dès lors, pour calculer une nouvelle valeur de clef, il nous faut passer en argument de la procédure stockée le nom de la table, et la procédure stockée doit retourner la nouvelle valeur à attribuer. Bien entendu, pour fiabiliser cette opération, nous ferons appel à la transaction du plus haut niveau d'isolation.
Voici le code d'une telle procédure réalisée en TRANSAC SQL, le langage de SQL Server :"
Code : Tout sélectionner
CREATE PROCEDURE CALC_NEW_KEY @NomTable CHAR(128)
AS
DECLARE @newKey INTEGER
-- gestion de la transaction : elle s'appelle CALC_A_KEY
-- et son niveau d'isolation est maximal
BEGIN TRANSACTION CALC_A_KEY
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
-- on calcule la nouvelle clef
SELECT @newKey = KEY_KEY_VALUE + 1
FROM SYS_KEYS
WHERE KEY_TABLE_NAME = + @NomTable
-- on met à jour la table des clefs
UPDATE SYS_KEYS
SET KEY_KEY_VALUE = @newKey
-- on valide la transaction
COMMIT TRANSACTION CALC_A_KEY
-- on retourne la valeur de la clef
SELECT @newKey
"Une telle procédure stockée pourra donc être appelée lors de l'insertion d'une ligne dans une table afin de calculer la nouvelle clef de manière automatique."
Voilà, j'espère que ça te sera utile

Avec SQL Server, le moins compliqué sera une procédure stockée. Je reprends ici les explications que j,ai dans un bouquin sur le SQL à ce propos.
[quote]"...nous construisons une table contenant la valeur de la dernière clé affectée à chacune des tables pour lesqe=uelles on veut ce calcul:[/quote]
[code]CREATE TABLE SYS_KEYS
(KEY_TABLE_NAME CHAR(128) NOT NULL PRIMARY KEY,
KEY_KEY_VALUE INTEGER NOT NULL DEFAULT 1)[/code]
[quote]"Avant toute insertion dans la base, on aura soin d'alimenter cette table avec le nom de toutes les tables qui demandent un tel calcul
Pour notre jeu d'essai, nous ferons la requête suivante :"[/quote]
[code]INSERT INTO SYS_KEYS
SELECT 'nom_table', MAX(champ_id) FROM nom_table[/code]
Note : le premier 'nom_table' de la sous-requête est ici une chaine de caractère.
[quote]"Dès lors, pour calculer une nouvelle valeur de clef, il nous faut passer en argument de la procédure stockée le nom de la table, et la procédure stockée doit retourner la nouvelle valeur à attribuer. Bien entendu, pour fiabiliser cette opération, nous ferons appel à la transaction du plus haut niveau d'isolation.
Voici le code d'une telle procédure réalisée en TRANSAC SQL, le langage de SQL Server :"[/quote]
[code]CREATE PROCEDURE CALC_NEW_KEY @NomTable CHAR(128)
AS
DECLARE @newKey INTEGER
-- gestion de la transaction : elle s'appelle CALC_A_KEY
-- et son niveau d'isolation est maximal
BEGIN TRANSACTION CALC_A_KEY
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
-- on calcule la nouvelle clef
SELECT @newKey = KEY_KEY_VALUE + 1
FROM SYS_KEYS
WHERE KEY_TABLE_NAME = + @NomTable
-- on met à jour la table des clefs
UPDATE SYS_KEYS
SET KEY_KEY_VALUE = @newKey
-- on valide la transaction
COMMIT TRANSACTION CALC_A_KEY
-- on retourne la valeur de la clef
SELECT @newKey[/code]
[quote]"Une telle procédure stockée pourra donc être appelée lors de l'insertion d'une ligne dans une table afin de calculer la nouvelle clef de manière automatique."[/quote]
Voilà, j'espère que ça te sera utile :)