Gibt eine Login-Prozedur an, die beim Start Optionen für die Verbindungskompatibilität setzt.
Zeichenfolge
sp_login_environment-Systemprozedur
DBA-Berechtigung ist erforderlich.
Diese Login-Prozedur ruft die Prozedur "sp_login_environment" zur Laufzeit auf, um die Verbindungseinstellungen für die Datenbank festzulegen. Die Login-Prozedur wird aufgerufen, nachdem alle Überprüfungen, ob die Verbindung eine gültige ist, durchgeführt wurden. Die durch die Option login_procedure angegebene Prozedur wird bei Ereignisverbindungen nicht ausgeführt.
Sie können die Optionseinstellungen der Standarddatenbank anpassen, indem Sie eine neue Prozedur erstellen, und die Prozedur login_procedure die neue Prozedur aufrufen lassen. Diese angepasste Prozedur muss entweder sp_login_environment aufrufen oder feststellen, wann eine TDS-Verbindung auftritt (siehe den sp_login_environment-Standardcode), und sp_tsql_environment direkt aufrufen. Anderenfalls können TDS-basierte Verbindungen unterbrochen werden. Sie dürfen weder sp_login_environment noch sp_tsql_environment bearbeiten.
Eine Fehlermeldung über ein abgelaufenes Kennwort mit dem SQLSTATE 08WA0 kann durch eine benutzerdefinierte Login-Prozedur signalisiert werden, um einem Benutzer mitzuteilen, dass sein Kennwort abgelaufen ist. Durch die Signalisierung des Fehlers können Anwendungen den Fehler prüfen und abgelaufene Kennwörter verarbeiten. Es wird empfohlen, eine Login-Richtlinie zu verwenden, um den Kennwortablauf zu implementieren, und nicht eine Login-Prozedur, die die Fehlermeldung über das abgelaufene Kennwort übermittelt.
Wenn Sie den Verbindungsparameter NewPassword=* verwenden, ist die Signalisierung dieses Fehlers erforderlich, damit die Clientbibliothek zur Eingabe eines neuen Kennwort auffordern kann. Wenn die Prozedur den SQLSTATE 28000 (Benutzer-ID oder Kennwort ungültig) oder SQLSTATE 08WA0 (Kennwort abgelaufen) übergibt, oder die Prozedur mit RAISERROR einen Fehler ausgibt, schlägt das Login fehl und der Benutzer erhält eine Fehlermeldung. Wenn Sie einen anderen Fehler signalisieren oder ein anderer Fehler auftritt, ist die Benutzeranmeldung erfolgreich und eine Meldung wird in das Log des Datenbankservers geschrieben.
Im folgenden Beispiel wird gezeigt, wie Sie eine Verbindung untersagen, indem der Fehler INVALID_LOGON angezeigt wird.
CREATE PROCEDURE DBA.login_check( ) BEGIN DECLARE INVALID_LOGON EXCEPTION FOR SQLSTATE '28000'; // Allow a maximum of 3 concurrent connections IF( DB_PROPERTY( 'ConnCount' ) > 3 ) THEN SIGNAL INVALID_LOGON; ELSE CALL sp_login_environment; END IF; END go GRANT EXECUTE ON DBA.login_check TO PUBLIC go SET OPTION PUBLIC.login_procedure='DBA.login_check' go |
Weitere Hinweise zu einer anderen Methode zum Sperren von Verbindungen finden Sie unter RAISERROR-Anweisung.
Das folgende Beispiel zeigt, wie Sie weitere Verbindungsversuche blockieren können, wenn die Anzahl der fehlgeschlagenen Verbindungen für einen Benutzer innerhalb einer 30-Minuten-Periode die Anzahl 3 übersteigt. Bei jedem Verbindungsversuch innerhalb der Blockierungsperiode wird der Fehler "ungültiges Kennwort" gemeldet, die Verbindungsversuche werden als fehlgeschlagen protokolliert. Das Log wird lange genug aufbewahrt, damit es von einem DBA inspiziert werden kann.
CREATE TABLE DBA.ConnectionFailure( pk INT PRIMARY KEY DEFAULT AUTOINCREMENT, user_name CHAR(128) NOT NULL, tm TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP ) go CREATE INDEX ConnFailTime ON DBA.ConnectionFailure( user_name, tm ) go CREATE EVENT ConnFail TYPE ConnectFailed HANDLER BEGIN DECLARE usr CHAR(128); SET usr = event_parameter( 'User' ); // Put a limit on the number of failures logged. IF (SELECT COUNT(*) FROM DBA.ConnectionFailure WHERE user_name = usr AND tm >= DATEADD( minute, -30, CURRENT TIMESTAMP )) < 20 THEN INSERT INTO DBA.ConnectionFailure( user_name ) VALUES( usr ); COMMIT; // Delete failures older than 7 days. DELETE DBA.ConnectionFailure WHERE user_name = usr AND tm < dateadd( day, -7, CURRENT TIMESTAMP ); COMMIT; END IF; END go CREATE PROCEDURE DBA.login_check( ) BEGIN DECLARE usr CHAR(128); DECLARE INVALID_LOGON EXCEPTION FOR SQLSTATE '28000'; SET usr = CONNECTION_PROPERTY( 'Userid' ); // Block connection attempts from this user // if 3 or more failed connection attempts have occurred // within the past 30 minutes. IF ( SELECT COUNT( * ) FROM DBA.ConnectionFailure WHERE user_name = usr AND tm >= DATEADD( minute, -30, CURRENT TIMESTAMP ) ) >= 3 THEN SIGNAL INVALID_LOGON; ELSE CALL sp_login_environment; END IF; END go GRANT EXECUTE ON DBA.login_check TO PUBLIC go SET OPTION PUBLIC.login_procedure='DBA.login_check' go |
Das nachstehende Beispiel zeigt, wie die Meldung Kennwort ist abgelaufen
signalisiert werden muss. Es wird empfohlen, eine Login-Richtlinie zu verwenden, um die Benachrichtigung über abgelaufene
Kennwörter zu implementieren.
CREATE PROCEDURE DBA.check_expired_login( ) BEGIN DECLARE PASSWORD_EXPIRED EXCEPTION FOR SQLSTATE '08WA0'; IF( Prüfbedingung_für_abgelaufenes_Kennwort ) THEN SIGNAL PASSWORD_EXPIRED; ELSE CALL sp_login_environment; END IF; END; |
Hinweise zu Login-Richtlinien finden Sie unter Überblick über die Verwaltung von Login-Richtlinien.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |