Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - データベース管理 » データベースの設定 » データベース・オプション » データベース・オプションの概要 » アルファベット順のオプション・リスト

 

login_procedure オプション [データベース]

起動時の接続互換性オプションを設定するログイン・プロシージャを指定します。

指定可能な値

文字列

デフォルト

sp_login_environment システム・プロシージャ

スコープ

DBA 権限が必要です。

備考

このログイン・プロシージャは、ランタイムに sp_login_environment プロシージャを呼び出して、データベース接続設定を決定します。このログイン・プロシージャは、すべてのチェックが完了し、接続が有効であることが確認された後で呼び出されます。login_procedure に指定したプロシージャはイベント接続では実行されません。

新規プロシージャを作成し、その新規プロシージャを呼び出すための login_procedure を設定して、デフォルト・データベース・オプション設定をカスタマイズできます。このカスタム・プロシージャは、sp_login_environment を呼び出すか、TDS 接続が確立されたことを検出し (デフォルトの sp_login_environment コードを確認します)、sp_tsql_environment を直接呼び出す必要があります。この操作が失敗した場合、TDS ベースの接続は切断されることがあります。sp_login_environment または sp_tsql_environment は編集しないでください。

ユーザ定義のログイン・プロシージャを使用して、パスワードの有効期限切れを示す SQLSTATE 08WA0 のエラー・メッセージを通知し、パスワードの有効期限が切れていることをユーザに示すことができます。エラーの通知により、アプリケーションはエラーを確認し、有効期限の切れたパスワードを処理できます。パスワードの有効期限を実装する場合はログイン・ポリシーを使用し、パスワードの有効期限切れのメッセージを返すログイン・プロシージャは使用しないでください。

NewPassword=* 接続パラメータを使用する場合は、このエラーを通知して、クライアント・ライブラリが新しいパスワードの入力を要求するプロンプトを表示できるようにする必要があります。プロシージャで SQLSTATE 28000 (無効なユーザ ID またはパスワード) または SQLSTATE 08WA0 (パスワードの有効期限切れ) が通知されるか、RAISERROR のエラーが発生すると、ログインは失敗し、エラーがユーザに返されます。その他のエラーを通知するか、別のエラーが発生した場合は、ユーザ・ログインは成功し、メッセージがデータベース・サーバ・メッセージ・ログに書き込まれます。

参照

次に、INVALID_LOGON エラーを通知して接続を拒否するサンプル・コードを示します。

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

接続を禁止する代替方法の詳細については、RAISERROR 文を参照してください。

次の例は、ユーザの失敗した接続の数が 30 分間で 3 回よりも多くなった場合に、接続試行をブロックする方法を示しています。ブロック期間中にブロックされた試行は、すべて無効パスワード・エラーを受け取り、ログに失敗として記録されます。DBA がログを解析するために、ログは十分な時間保持されます。

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

次の例は、「パスワードの有効期限が切れています。」というメッセージの通知方法を示します。パスワードの有効期限切れの通知を実装するには、ログイン・ポリシーを使用してください。

CREATE PROCEDURE DBA.check_expired_login( )
BEGIN
  DECLARE PASSWORD_EXPIRED EXCEPTION FOR SQLSTATE '08WA0';

  IF( condition-to-check-for-expired-password ) THEN
      SIGNAL PASSWORD_EXPIRED;
  ELSE
      CALL sp_login_environment;
  END IF;
END;

ログイン・ポリシーの詳細については、ログイン・ポリシーの管理の概要を参照してください。