问题分析:因SQL服务器中毒,导致病毒篡改SQL用户的密码,病毒为了阻止操作员手工修正(修改)SQL用户的密码,而把存储过程'sp_password'删除,导致的问题。错误如下图所示:
解决思路:在系统中重新建一个'sp_password'的存储过程,以便更新现有的SQL用户密码
步骤:
1、打开查询分析器:
方法1.可以依次打开:开始--->运行,输入命令isqlw,按回车即可启动查询分析器
方法2.通过开始菜单、程序、MicrosoftSQLServer、找到“查询分析器”单击打开即可启动
2、复制、粘贴下面的语句运行一下就ok了。
--SQL代码开始
sp_configure'allowupdates',1
RECONFIGUREWITHOVERRIDE
go
usemaster
go
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[sp_password]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo].[sp_password]
go
createproceduresp_password
@oldsysname=NULL,--theold(current)password
@newsysname,--thenewpassword
@loginamesysname=NULL--usertochangepasswordon
as
--SETUPRUNTIMEOPTIONS/DECLAREVARIABLES--
setnocounton
declare@selfint
select@self=CASEWHEN@loginameisnullTHEN1ELSE2END
--RESOLVELOGINNAME
if@loginameisnull
select@loginame=suser_sname()
--CHECKPERMISSIONS(SecurityAdminperRichardWaymire)--
IF(notis_srvrolemember('securityadmin')=1)
ANDnot@self=1
begin
dbccauditevent(107,@self,0,@loginame,NULL,NULL,NULL)
raiserror(15210,-1,-1)
return(1)
end
ELSE
begin
dbccauditevent(107,@self,1,@loginame,NULL,NULL,NULL)
end
--DISALLOWUSERTRANSACTION--
setimplicit_transactionsoff
IF(@@trancount>0)
begin
raiserror(15002,-1,-1,'sp_password')
return(1)
end
--RESOLVELOGINNAME(disallowsntnames)
ifnotexists(select*frommaster.dbo.sysloginswhere
loginname=@loginameandisntname=0)
begin
raiserror(15007,-1,-1,@loginame)
return(1)
end
--IFnon-SYSADMINATTEMPTINGCHANGETOSYSADMIN,REQUIREPASSWORD(218078)--
if(@self<>1ANDis_srvrolemember('sysadmin')=0ANDexists
(SELECT*FROMmaster.dbo.sysloginsWHEREloginname=@loginameandisntname=0
ANDsysadmin=1))
SELECT@self=1
--CHECKOLDPASSWORDIFNEEDED--
if(@self=1or@oldisnotnull)
ifnotexists(select*frommaster.dbo.sysxlogins
wheresrvidISNULLand
name=@loginameand
((@oldisnullandpasswordisnull)or
(pwdcompare(@old,password,(CASEWHENxstatus&2048=2048THEN1ELSE0END))=1)))
begin
raiserror(15211,-1,-1)
return(1)
end
--CHANGETHEPASSWORD--
updatemaster.dbo.sysxlogins
setpassword=convert(varbinary(256),pwdencrypt(@new)),xdate2=getdate(),xstatus=xstatus&(~2048)
wherename=@loginameandsrvidISNULL
--UPDATEPROTECTIONTIMESTAMPFORMASTERDB,TOINDICATESYSLOGINSCHANGE--
exec('usemastergrantalltonull')
--FINALIZATION:RETURNSUCCESS/FAILURE--
if@@error<>0
return(1)
raiserror(15478,-1,-1)
return(0)--sp_password
GO
sp_configure'allowupdates',0
RECONFIGUREWITHOVERRIDE
--SQL代码结束