登录触发器在身份验证完成后、用户会话建立前触发,可用于审计或限制会话数,但无法拒绝未通过认证的登录;阻止特定ip需依赖防火墙、网络acl或数据库专属配置(如postgresql的pg_hba.conf)。

SQL Server 里没有登录触发器能直接拦 IP
SQL Server 的 LOGON 触发器确实能响应登录事件,但它运行在登录**成功之后、会话建立之初**,此时连接已建立,用户身份已验证——你无法用它“拒绝登录”。常见误解是以为它像防火墙一样前置拦截,实际它更像一个审计或清理钩子。如果目标是阻止特定 IP 连入,得在更外层做:比如 SQL Server 配置的登录筛选(不支持 IP)、Windows 防火墙、网络设备 ACL,或应用层网关控制。
MySQL 8.0+ 可用 VALIDATE PASSWORD + 插件间接限制,但非原生 IP 拦截
MySQL 原生不提供登录时基于客户端 IP 的条件拒绝机制。VALIDATE PASSWORD 插件只校验密码强度;authentication_policy 等配置项也不接受 IP 列表。唯一接近的方案是启用 validate_password 并配合自定义认证插件(如编写 C 插件读取 INFORMATION_SCHEMA.PROCESSLIST 中的 HOST 字段再 abort),但开发成本高、维护难、且 MySQL 官方不推荐生产环境随意加载未签名插件。
PostgreSQL 的 pg_hba.conf 是最可靠、最常用的 IP 控制入口
PostgreSQL 不靠触发器,而是用配置文件 pg_hba.conf 实现登录前精准拦截。它按顺序匹配连接类型、数据库、用户、客户端地址和认证方式。要禁止某 IP,只需加一条规则:
# TYPE DATABASE USER ADDRESS METHOD host all all 192.168.1.100/32 reject
注意几点:
-
reject必须写在允许规则之前,否则会被更宽泛的host all all 0.0.0.0/0 md5先匹配 - IPv6 地址需用
::1/128格式,不能混用 CIDR 和通配符 - 修改后必须执行
SELECT pg_reload_conf();或重启服务才生效 - 该规则对 superuser 同样有效,但本地
peer或trust认证可能绕过,需一并检查
触发器不是登录控制工具,别把它当防火墙用
所有主流关系型数据库的 DML/DCL 触发器(AFTER INSERT、BEFORE UPDATE)或 DDL 触发器,都只作用于已建立连接后的语句执行阶段。它们看不到客户端 IP,也无法中断登录握手过程。试图在 sys.dm_exec_sessions 或 pg_stat_activity 里轮询查 IP 再杀会话,属于事后补救,既消耗资源,又存在时间窗口——恶意连接可能已在那几十毫秒内执行了敏感操作。











