今天公司开发的某个软件升级,客户端字符集全部从cp850改为cp936。为避免未改字符集的用户误登录,我写了一个登录触发器,强行进行检查。一旦发现客户端程序使用的不是cp936,强行中止会话。
注意,登录错误信息,不会输出到客户端,而是记录在数据库系统日志中。
- /* 登录用户的缺省数据库,有时不一定是master库 */
- use master
- go
- /* 检查登录字符集的存储过程 */
- If Exists( Select 1 From sysobjects
- Where type = 'P' and name = 'sp_checklogin' )
- drop procedure sp_checklogin
- go
- create procedure sp_checklogin
- as
- begin
- declare @validcs varchar(100)
- declare @hostname varchar(30)
- declare @program_name varchar(30)
- declare @ipaddr varchar(64)
- select @validcs = 'cp936',
- @hostname = hostname,
- @program_name = program_name,
- @ipaddr = ipaddr
- from master..sysprocesses
- where spid = @@spid
- if @@client_csname <> @validcs
- begin
- print "Login error: your client charset is %1!, please set it to %2!." ,
- @@client_csname, @validcs
- print "--host name: %1!", @hostname
- print "--program name: %1!", @program_name
- print "--IP address: %1!", @ipaddr
- select syb_quit()
- end
- end
- go
- /* 设置TryUser用户登录触发器的例子 */
- sp_modifylogin TryUser, 'login script', sp_checklogin
- go