存储过程sp_addlogin原版重建SQL Server 2000错误2812

解决错误 2812: 未能找到存储过程sp_addlogin,通常在添加用户时此错误提示。故障原因可能是由于黑客木马侵入,将sa密码更改,并删除了此存储过程,由此阻碍对用户的添加。解决方案就是重建这个存储过程,操作过程如下:

开始菜单中,找打并打开查询分析器,或在运行中输入isqlw直接打开,输入以下代码运行:

create procedure sp_addlogin
  @loginame sysname
  ,@passwd     sysname = Null
  ,@defdb      sysname = 'master'   -- UNDONE: DEFAULT CONFIGURABLE???
  ,@deflanguage  sysname = Null
  ,@sid  varbinary(16) = Null
  ,@encryptopt varchar(20) = Null
AS
  -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
 set nocount on
 Declare @ret  int  -- return value of sp call

  -- CHECK PERMISSIONS --
 IF (not is_srvrolemember('securityadmin') = 1)
 begin
  raiserror(15003,-1,-1, 'securityadmin')
  return (1)
 end

  -- DISALLOW USER TRANSACTION --
 set implicit_transactions off
 IF (@@trancount > 0)
 begin
 raiserror(15002,-1,-1,'sp_addlogin')
 return (1)
 end

  -- VALIDATE LOGIN NAME AS:
  -- (1) Valid SQL Name (SQL LOGIN)
  -- (2) No backslash (NT users only)
  -- (3) Not a reserved login name
 execute @ret = sp_validname @loginame
 if (@ret <> 0)
    return (1)
  if (charindex('\\', @loginame) > 0)
  begin
     raiserror(15006,-1,-1,@loginame)
    return (1)
  end

 --Note: different case sa is allowed.
 if (@loginame = 'sa' or lower(@loginame) in ('public'))
 begin
 raiserror(15405, -1 ,-1, @loginame)
 return (1)
 end

  -- LOGIN NAME MUST NOT ALREADY EXIST --
 if exists(select * from master.dbo.syslogins where loginname = @loginame)
 begin
 raiserror(15025,-1,-1,@loginame)
 return (1)
 end

 -- VALIDATE DEFAULT DATABASE --
 IF db_id(@defdb) IS NULL
 begin
 raiserror(15010,-1,-1,@defdb)
   return (1)
 end

 -- VALIDATE DEFAULT LANGUAGE --
 IF (@deflanguage IS NOT Null)
 begin
 Execute @ret = sp_validlang @deflanguage
 IF (@ret <> 0)
  return (1)
 end
 ELSE
 begin
 select @deflanguage = name from master.dbo.syslanguages
 where langid = @@default_langid --server default language
 
 if @deflanguage is null
  select @deflanguage = N'us_english'
 end

 -- VALIDATE SID IF GIVEN --
 if ((@sid IS NOT Null) and (datalength(@sid) <> 16))
 begin
 raiserror(15419,-1,-1)
  return (1)
 end
 else if @sid is null
 select @sid = newid()
 if (suser_sname(@sid) IS NOT Null)
 begin
 raiserror(15433,-1,-1)
  return (1)
 end

 -- VALIDATE AND USE ENCRYPTION OPTION --
 declare @xstatus smallint
 select @xstatus = 2 -- access
 if @encryptopt is null
 select @passwd = pwdencrypt(@passwd)
 else if @encryptopt = 'skip_encryption_old'
 begin
 select @xstatus = @xstatus | 0x800, -- old-style encryption
  @passwd = convert(sysname, convert(varbinary(30), convert(varchar(30), @passwd)))
 end
 else if @encryptopt <> 'skip_encryption'
 begin
 raiserror(15600,-1,-1,'sp_addlogin')
 return 1
 end

  -- ATTEMPT THE INSERT OF THE NEW LOGIN --
 INSERT INTO master.dbo.sysxlogins VALUES
    (NULL, @sid, @xstatus, getdate(),
       getdate(), @loginame, convert(varbinary(256), @passwd),
       db_id(@defdb), @deflanguage)

  -- FINALIZATION: RETURN SUCCESS/FAILURE --
 if @@error <> 0
    return (1)
 raiserror(15298,-1,-1)
 return (0) -- sp_addlogin
点赞