Inhalt einer PN:
Zitat von
Romber:
Hallo jensw_2000!
ich bin mir nicht sicher, dass Sie sich noch daran errinern, aber vor einiger Zeit haben Sie mir bei der Lösung meines Problems sehr kompetent geholfen. Das war diesen Beitrag Login-Funktion: nur ein Benutzer mit bestimmten Zugangsdaten. Dort mit dem Beitrag #26 haben Sie mir die Lösung gepostet. Diese Lösung ist absoloute spitze, die verwende ich immer noch und es funktioniert super. Noch mal vielen Dank!
Ich stehe jetzt vor einer Aufgabe, die ich ohne Ihrer Hilfe ganz sicher nicht lösen kann. Und zwar geht es immer noch um diese
SQL-Code, die Sie mir damals gepostet haben. Diese Code bzw. diese SP gewährleistet, dass nur ein Benutzer mit den bestimmten Zugangsdaten zur selber Zeit sich einloggen kann.
Mein Problem ist: ich muss die
SQL-Code jetzt so umschreiben, dass sich max. 3 Benutzer mit den gleichen Zugangsdaten zur gleicher Zeit anmelden können. Leider habe ich von
SQL nicht viel Ahnung und werde Ihnen sehr dankbar, wenn Sie mir dabei helfen würden.
P.S. Falls es viel Zeit braucht, würde ich natürlich gerne für Ihre Zeit bezahlen.
Im Voraus vielen Dank!
Für den Fall das jemand mal etwas Ähnliches benötigt, hänge ich den geänderten Code hier noch einmal komplett an.
Erklärungen zur Verwendung gibt es im
Post #26.
Zitat von
romber:
P.S. Falls es viel Zeit braucht, würde ich natürlich gerne für Ihre Zeit bezahlen.
Ich hoffe das du mir auch mal hilfst, ohne gleich eine Rechnung zu schreiben
.
DDL der Tabelle "SYS_ActiveUsers"
SQL-Code:
CREATE TABLE [SYS_ActiveUsers] (
[USERNAME] varchar(50) NOT NULL,
[Workstation] varchar(12) NOT NULL,
[LAST_SEEN] datetime DEFAULT (getdate()) NOT NULL,
[LOCK_TIME_SECS] int DEFAULT (600) NOT NULL
)
ON [PRIMARY]
GO
DDL der Stored Procedure "SYS_Check_User_LoginCount"
SQL-Code:
CREATE PROCEDURE SYS_Check_User_LoginCount
(
@USERNAME
VARCHAR(50) =
NULL,
@WORKSTATION
VARCHAR(12) =
NULL,
@LOGOUT
BIT =
NULL,
@AllowLogin
BIT = 0 OUTPUT
)
AS
BEGIN
-- Variablen deklarieren
DECLARE @TEMPTIME
DATETIME
DECLARE @TEMPDIFF
INTEGER
DECLARE @MAXLOGINS
INTEGER
DECLARE @CURRENTLOGINS
INTEGER
-- Standardwerte setzen
SET @MAXLOGINS = 2
-- Ein Username kann sich von 2 unterschiedlichen Workstations anmenden
SET @CURRENTLOGINS = 0
-- @CURRENTLOGINS initialisieren
-- Parameter überprüfen
IF @USERNAME
IS NULL OR @WORKSTATION
IS NULL
BEGIN
SET @AllowLogin = 0
RAISERROR('
Benutzername und Arbeitsstationsname müssen übermittelt werden',16,1,'
SQL-Login')
END
-- Logout ??
IF @LOGOUT
IS NULL SET @LOGOUT =0
IF @LOGOUT = 1
BEGIN
-- Benutzer meldet sich regulär ab
DELETE FROM SYS_ActiveUsers
WHERE USERNAME=@USERNAME
AND WORKSTATION=@WORKSTATION
SET @AllowLogin=0
END
ELSE BEGIN
IF EXISTS (
SELECT USERNAME
FROM SYS_ActiveUsers
WHERE USERNAME=@USERNAME
AND WORKSTATION = @WORKSTATION
)
BEGIN
-- Relogin (selber User von der selben Workstation)
-- Last_Seen Updaten und AllowLogin setzen
UPDATE SYS_ActiveUsers
SET LAST_SEEN = GETDATE()
WHERE USERNAME=@USERNAME
AND WORKSTATION=@WORKSTATION
SET @AllowLogin=1
END
ELSE BEGIN
-- Login des selben Users von einer anderen Workstation --
-- Inaktive User (mit anderen Workstations) bereinigen,
-- dann die Anzahl der Logins pro Username zählen.
-- Prüfen, ob ein die Anzahl @MAXLOGINS für diesen User erreicht wurde.
-- Wenn Anzahl der Logins <= @MAXLOGINS dann Login erlauben und Last_Seen setzen,
-- sonst Login verweigern.
-- inaktive User löschen
DELETE
FROM SYS_ActiveUsers
WHERE USERNAME=@USERNAME
AND WORKSTATION <> @WORKSTATION
AND ABS( DATEDIFF( SECOND,LAST_SEEN,GETDATE() ) ) > LOCK_TIME_SECS
-- Zählen, wie oft @USERNAME angemeldet ist ...
SELECT @CURRENTLOGINS =
Count(*)
FROM SYS_ActiveUsers
WHERE USERNAME=@USERNAME
-- Wenn die Anzahl der Logins <= @MAXLOGINS dann User anmelden
IF @CURRENTLOGINS < @MAXLOGINS
BEGIN
INSERT INTO SYS_ActiveUsers (USERNAME
,WORKSTATION
,LAST_SEEN
,LOCK_TIME_SECS)
VALUES (@USERNAME
,@WORKSTATION
,GETDATE()
,600)
-- Timeout Sekunden (Verfallszeit)
SET @AllowLogin=1
END
ELSE BEGIN
-- sonst Login verweigern
SET @AllowLogin=0
END
END
END
END
GO
Delphi - Funktion um den User anzumelden, um das Login zu "Refreshen" und um den User anzumelden
Delphi-Quellcode:
var Authentificated : boolean;
...
...
function CheckLogin(Logout:Boolean): Boolean;
var SP:TAdoStoredProc;
begin
{
SQL - Syntax Hinweis
--------------------------------------------
CREATE PROCEDURE SYS_Check_User_LoginCount
(
@USERNAME VARCHAR(50) = NULL,
@WORKSTATION VARCHAR(12) = NULL,
@LOGOUT BIT = NULL,
@AllowLogin BIT = 0 OUTPUT
)
}
SP:=TAdoStoredProc.create(
nil);
SP.Connection:=MeineAdoConn;
// Hier deine AdoConn
try
SP.Procedurename:='
SYS_Check_User_LoginCount';
SP.Parameters.refresh;
SP.Parameters[1].Value:=MeinUserName;
SP.Parameters[2].Value:=MeinPcName;
if Logout
then SP.Parameters[3].Value:=1
else SP.Parameters[3].Value:=0;
SP.ExecProc;
Result:=SP.Parameters[4].Value;
finally
FreeAndNil(SP);
end;
if Authentificated
AND (
NOT Logout)
AND (
NOT Result)
then
begin
Showmessage('
Ihr login wird gelöscht, weil von Ihrer Arbeitsstation keine "KeepAlive-Aufrufe"'+#13#10+
'
an die SP "SYS_Check_User_LoginCount" gesendet wurden, bzw. deren Timing nicht passt ...');
end;
if (
NOT Authentificated)
AND (
NOT Result)
then
begin
Showmessage('
Die Anzahl der erlaubten Anmeldungen für "'+MeinUsername+'
" ist überschritten.'+#13#10+
'
Bitte verwenden Sie einen anderen Benutzernamen oder versuchen Sie es später noch einmal.');
end;
Authentificated:=(
NOT Logout)
AND RESULT;
end;
Schöne Grüße,
Jens