Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Juanito a écrit:Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans
Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/
Juanito a écrit:
Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans
Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/
Juanito a écrit:Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans
Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/
Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours
de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières
modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours
de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières
modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours
de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières
modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
--
Thierry
"Juanito" a écrit dans le message de news:Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà affichée
et en cours de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur
un poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire
bloquer la fiche sur le poste X et lors de son appel sur le poste Y
afficher "le client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi
ses modifications, que la fiche a déjà été modifiée par quelqu'un
d'autres pendant ce temps. Ca je pourrais le faire en testant des
colonnes dans lesquelles je mémoriserais les dates et heures des
dernières modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
--
Thierry
"Juanito" <jean.cougnaud@libertysurf.fr> a écrit dans le message de news:
mn.1b817d7c7debc995.68503@libertysurf.fr...
Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà affichée
et en cours de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur
un poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire
bloquer la fiche sur le poste X et lors de son appel sur le poste Y
afficher "le client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi
ses modifications, que la fiche a déjà été modifiée par quelqu'un
d'autres pendant ce temps. Ca je pourrais le faire en testant des
colonnes dans lesquelles je mémoriserais les dates et heures des
dernières modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
--
Thierry
"Juanito" a écrit dans le message de news:Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà affichée
et en cours de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur
un poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire
bloquer la fiche sur le poste X et lors de son appel sur le poste Y
afficher "le client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi
ses modifications, que la fiche a déjà été modifiée par quelqu'un
d'autres pendant ce temps. Ca je pourrais le faire en testant des
colonnes dans lesquelles je mémoriserais les dates et heures des
dernières modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
Juanito a écrit:Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
Juanito a écrit:
Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
Juanito a écrit:Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
Erratum :
COMMIT TRANSACTION au lieu de END TRANSACTION
--
Thierry
"Thierry" a écrit dans le message de news:
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
-- Thierry
"Juanito" a écrit dans le message de news:Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours
de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières
modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
Erratum :
COMMIT TRANSACTION au lieu de END TRANSACTION
--
Thierry
"Thierry" <tper_NOSPAM@vfemail.net> a écrit dans le message de news:
uinJhvcNIHA.1204@TK2MSFTNGP03.phx.gbl...
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
-- Thierry
"Juanito" <jean.cougnaud@libertysurf.fr> a écrit dans le message de news:
mn.1b817d7c7debc995.68503@libertysurf.fr...
Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours
de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières
modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
Erratum :
COMMIT TRANSACTION au lieu de END TRANSACTION
--
Thierry
"Thierry" a écrit dans le message de news:
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
-- Thierry
"Juanito" a écrit dans le message de news:Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours
de modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières
modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
Juanito a écrit:Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
Juanito a écrit:
Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
Juanito a écrit:Dans le cadre d'utilisation multi-postes, une même fiche peut-être
appelée par plusieurs postes. Je souhaite afficher un message ou
interdire la modification d'une information si celle-ci est déjà
affichée et en cours de modification sur un autre poste.
Bonjour,
Le meilleur moyen de le faire, est de gérer ce blocage manuellement,
dans une table de verrous, qui contient le nom de la table, la clé
primaire de la ligne, avec date de verrou, spid et utilisateur.
Ci-dessous le code de deux procédures idoines que j'avais faites pour ça
il y a qq années (SQL Server 2000, préfixées par sp_ et posées dans Master).
CREATE PROCEDURE dbo.sp_lockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(150) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
IF @DbId IS NULL SET @DbId = DB_ID()
IF EXISTS (SELECT 1 FROM tools.dbo.RecordLock WHERE RecordType > @recordType AND RecordId = @recordId AND DatabaseId = @DbId) BEGIN
SELECT
@msg = 'Record locked in database ' + DB_NAME(@DbId) + ' by ' +
ISNULL(u.FullName, 'unknown') + ' since ' +
CONVERT(varchar(30), l.LockingTime, 109) + ' from ' + RTRIM(l.HostName)
FROM
tools.dbo.RecordLock l
LEFT JOIN contacts.dbo.v_perm_UserFullInfo u ON u.DatabaseLogin > l.DatabaseLogin
WHERE
l.RecordType = @recordType AND
l.RecordId = @recordId AND
l.DatabaseId = @DbId
SET @done=0
END ELSE BEGIN
INSERT INTO tools.dbo.RecordLock WITH (ROWLOCK)
(DatabaseLogin,Hostname, DatabaseId, RecordType, RecordId, LockingTime)
VALUES(tools.dbo.fn_sysuser(), ISNULL(HOST_NAME(),'unknown'), @DbId,
@recordType, @recordId, GETDATE())
SET @msg='Locked ok'
SET @done=1
END
END
CREATE PROCEDURE dbo.sp_unlockRecord
@recordType varchar(30),
@recordId int,
@done smallint output,
@msg varchar(80) output,
@DbId smallint = NULL
AS BEGIN
SET NOCOUNT ON
DECLARE @rowcount int
IF @DbId IS NULL SET @DbId = DB_ID()
DELETE tools.dbo.RecordLock WITH (ROWLOCK)
WHERE DatabaseId = @DbId AND
RecordType = @recordType AND
RecordId = @recordId
SELECT @done = @@ERROR,
@rowcount = @@ROWCOUNT
IF (@RowCount = 0) BEGIN
SET @done = 1
SET @msg = 'Record not locked!'
END ELSE IF @done = 0 BEGIN
SET @done = 1
SET @msg = 'Unlocked ok!'
END ELSE BEGIN
SET @done=0
SET @msg = 'Error while unlocking!'
END
END
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
--
Thierry
"Juanito" a écrit dans le message de news:Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours de
modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
--
Thierry
"Juanito" <jean.cougnaud@libertysurf.fr> a écrit dans le message de news:
mn.1b817d7c7debc995.68503@libertysurf.fr...
Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours de
modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
BEGIN TRANSACTION
SELECT .... FROM ... (UPDLOCK)
...
END TRANSACTION
--
Thierry
"Juanito" a écrit dans le message de news:Bonjour,
Ma question est peut-être surprenante, je sais que Sql server gère les
blocages lors des mémorisations tout seul mais je vous expose le souci :
Dans le cadre d'utilisation multi-postes, une même fiche peut-être appelée
par plusieurs postes. Je souhaite afficher un message ou interdire la
modification d'une information si celle-ci est déjà affichée et en cours de
modification sur un autre poste.
Par exemple, la fiche du client "Toto" est en cours de modification sur un
poste X. Le poste Y veut lui aussi modifier cette fiche. Je désire bloquer
la fiche sur le poste X et lors de son appel sur le poste Y afficher "le
client est en cours de modification sur un autre poste".
Quelles instructions Sql permettent de bloquer, vérifier le blocage et
débloquer une ligne ?
Mon but n'est pas d'avertir le 2ème utilisateur, après qu'il ait saisi ses
modifications, que la fiche a déjà été modifiée par quelqu'un d'autres
pendant ce temps. Ca je pourrais le faire en testant des colonnes dans
lesquelles je mémoriserais les dates et heures des dernières modifications.
Je pourrais aussi rajouter une colonne dans les tables concernées pour un
mettre le code de l'utilisateur concerné et l'enlever à la fin de sa
modification, mais en cas de plantage, la valeur reste dans la colonne et
la ligne est toujours considérée comme bloquée.
Voila, je ne sais pas si j'ai été très clair dans ma demande ...
Merci de vos conseils
Jean
> J'ai essayé de faire
une requête qui fait "Begin Transaction"
Une autre qui fait "select MaColonne From MaTable (Updlock) Where
MaCle='toto'"
Je le lance sur 2 postes et cela ne me donne pas d'erreur...
> J'ai essayé de faire
une requête qui fait "Begin Transaction"
Une autre qui fait "select MaColonne From MaTable (Updlock) Where
MaCle='toto'"
Je le lance sur 2 postes et cela ne me donne pas d'erreur...
> J'ai essayé de faire
une requête qui fait "Begin Transaction"
Une autre qui fait "select MaColonne From MaTable (Updlock) Where
MaCle='toto'"
Je le lance sur 2 postes et cela ne me donne pas d'erreur...
En fait, le développement que je fais est en Web et la crainte que j'ai
est que s'il y a coupure de ligne ou un plantage qualconque, on se
retrouve avec des lignes qui sont condidérées comme bloquées alors que
cela n'est pas le cas.
En fait, le développement que je fais est en Web et la crainte que j'ai
est que s'il y a coupure de ligne ou un plantage qualconque, on se
retrouve avec des lignes qui sont condidérées comme bloquées alors que
cela n'est pas le cas.
En fait, le développement que je fais est en Web et la crainte que j'ai
est que s'il y a coupure de ligne ou un plantage qualconque, on se
retrouve avec des lignes qui sont condidérées comme bloquées alors que
cela n'est pas le cas.