解決思路如下:
利用Sybase ASE的特性提供的存儲過程 sp_modifylogin,對登錄的合法性進行驗證。
先新創建一個權限足夠高的用戶,將來當服務器有問題時,好用來恢復sa
接下來將sa的login script綁定
use master
go
drop procedure sp_bindlogin
go
存儲過程名字弄個像系統的一樣
create procedure sp_bindlogin
as
begin
declare @hostname varchar(100)
declare @program_name varchar(100)
declare @ipaddr varchar(100)
declare @new datetime
select @hostname = hostname,
@program_name = program_name,
@ipaddr = ipaddr
from master..sysprocesses
where spid = @@spid
登錄機器限定
if @hostname != '機器名'
begin
shutdown with nowait
end
登錄機器IP限定
if @ipaddr != '機器IP'
begin
shutdown with nowait
end
登錄應用程序限定
if @program_name in ('SQL_Advantage', 'isql')
begin
shutdown with nowait
end
select @new = getdate()
登錄時間限定
if @new >= '20080808'
begin
shutdown with nowait
end
end
go
sp_hidetext sp_bindlogin
go
sp_modifylogin sa, 'login script', sp_bindlogin
go
經過以上處理,sa只能在本機,並且不能使用 isql 、sqladv ,在 20080808 之前 登錄數據庫。
這裡的邏輯是可以自由編寫的。
這裡的合法性驗證不通過的處理方法是 shutdown 。
可以把 shutdown 換成以下存儲過程。這樣就殺掉了自己。不會影響服務,只是需要做一些額外的配置。
drop procedure sp_killme
go
create procedure sp_killme
as
begin
declare @cmd varchar(100)
select @cmd = 'kill ' + convert(varchar(20), @@spid)
exec sp_remotesql 'local', @cmd
end
go
sp_hidetext sp_killme
go