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;

有关登录策略的信息,请参见管理登录策略概述