阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

手机号码,快捷登录

老司机
查看: 5283|回复: 5

[讨论] 错误2812:未能找到存储过程'sp_password'sql2000无法清除密码

[复制链接]
  • TA的每日心情
    擦汗
    2024-5-27 14:01
  • 签到天数: 838 天

    [LV.10]以坛为家III

    发表于 2012-11-6 14:30:23 | 显示全部楼层 |阅读模式
    错误2812:未能找到存储过程'sp_password'
    123.jpg
    解决方案:    现在有很多自动扫描1433端口的软件,会破坏sp_password存储过程。造成在修改SA密码的时候出现2812错误下边是解决代码,用WINDOWS身份验证登陆到SQL SERVER的查询工具。复制--粘贴--执行就OK拉。 create procedure sp_password
    @old sysname = NULL, -- the old (current) password
    @new sysname, -- the new password
    @loginame sysname = NULL -- user to change password on
    as
    -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
    set nocount on
    declare @self int
    select @self = CASE WHEN @loginame is null THEN 1 ELSE 2 END

    -- RESOLVE LOGIN NAME
    if @loginame is null
    select @loginame = suser_sname()

    -- CHECK PERMISSIONS (SecurityAdmin per Richard Waymire) --
    IF (not is_srvrolemember('securityadmin') = 1)
    AND not @self = 1
    begin
    dbcc auditevent (107, @self, 0, @loginame, NULL, NULL, NULL)
    raiserror(15210,-1,-1)
    return (1)
    end
    ELSE
    begin
    dbcc auditevent (107, @self, 1, @loginame, NULL, NULL, NULL)
    end

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

    -- RESOLVE LOGIN NAME (disallows nt names)
    if not exists (select * from master.dbo.syslogins where
    loginname = @loginame and isntname = 0)
    begin
    raiserror(15007,-1,-1,@loginame)
    return (1)
    end

    -- IF non-SYSADMIN ATTEMPTING CHANGE TO SYSADMIN, REQUIRE PASSWORD (218078) --
    if (@self <> 1 AND is_srvrolemember('sysadmin') = 0 AND exists
    (SELECT * FROM master.dbo.syslogins WHERE loginname = @loginame and isntname = 0
    AND sysadmin = 1) )
    SELECT @self = 1

    -- CHECK OLD PASSWORD IF NEEDED --
    if (@self = 1 or @old is not null)
    if not exists (select * from master.dbo.sysxlogins
    where srvid IS NULL and
    name = @loginame and
    ( (@old is null and password is null) or
    (pwdcompare(@old, password, (CASE WHEN xstatus&2048 = 2048 THEN 1 ELSE 0 END)) = 1) ) )
    begin
    raiserror(15211,-1,-1)
    return (1)
    end

    -- CHANGE THE PASSWORD --
    update master.dbo.sysxlogins
    set password = convert(varbinary(256), pwdencrypt(@new)), xdate2 = getdate(), xstatus = xstatus & (~2048)
    where name = @loginame and srvid IS NULL

    -- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE SYSLOGINS CHANGE --
    exec('use master grant all to null')

    -- FINALIZATION: RETURN SUCCESS/FAILURE --
    if @@error <> 0
    return (1)
    raiserror(15478,-1,-1)
    return (0) -- sp_password
    以上代码在SQL 2000 SP4上测试通过。






    该贴已经同步到 ipcfan的微博

    补充内容 (2013-12-9 08:47):
    create procedure sp_password
        @old sysname = NULL,        -- the old (current) password
        @new sysname,               -- the new password
        @loginame sysname = NULL    -- user to change password on
    as
        -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
    set nocount on
        declare @self int
        select @self = CASE WHEN @loginame is null THEN 1 ELSE 2 END

        -- RESOLVE LOGIN NAME
        if @loginame is null
            select @loginame = suser_sname()

        -- CHECK PERMISSIONS (SecurityAdmin per Richard Waymire) --
    IF (not is_srvrolemember('securityadmin') = 1)
            AND not @self = 1
    begin
        dbcc auditevent (107, @self, 0, @loginame, NULL, NULL, NULL)
        raiserror(15210,-1,-1)
        return (1)
    end
    ELSE
    begin
        dbcc auditevent (107, @self, 1, @loginame, NULL, NULL, NULL)
    end

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

        -- RESOLVE LOGIN NAME (disallows nt names)
        if not exists (select * from master.dbo.syslogins where
                        loginname = @loginame and isntname = 0)
    begin
      raiserror(15007,-1,-1,@loginame)
      return (1)
    end

    -- IF non-SYSADMIN ATTEMPTING CHANGE TO SYSADMIN, REQUIRE PASSWORD (218078) --
    if (@self <> 1 AND is_srvrolemember('sysadmin') = 0 AND exists
       (SELECT * FROM master.dbo.syslogins WHERE loginname = @loginame and isntname = 0
        AND sysadmin = 1) )
      SELECT @self = 1

        -- CHECK OLD PASSWORD IF NEEDED --
        if (@self = 1 or @old is not null)
            if not exists (select * from master.dbo.sysxlogins
                            where srvid IS NULL and
                name = @loginame and
                         ( (@old is null and password is null) or
                                  (pwdcompare(@old, password, (CASE WHEN xstatus&2048 = 2048 THEN 1 ELSE 0 END)) = 1) )   )
            begin
          raiserror(15211,-1,-1)
          return (1)
         end

        -- CHANGE THE PASSWORD --
        update master.dbo.sysxlogins
    set password = convert(varbinary(256), pwdencrypt(@new)), xdate2 = getdate(), xstatus = xstatus & (~2048)
    where name = @loginame and srvid IS NULL

    -- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE SYSLOGINS CHANGE --
    exec('use master grant all to null')

        -- FINALIZATION: RETURN SUCCESS/FAILURE --
    if @@error <> 0
            return (1)
        raiserror(15478,-1,-1)
    return  (0) -- sp_password
    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    擦汗
    2024-5-27 14:01
  • 签到天数: 838 天

    [LV.10]以坛为家III

     楼主| 发表于 2012-11-6 14:32:23 | 显示全部楼层
    先在企业管理器中


    999.jpg

    在查询分析器执行以下代码:
      create procedure sp_password
    @old sysname = NULL, -- the old (current) password
    @new sysname, -- the new password
    @loginame sysname = NULL -- user to change password on
    as
    -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
    set nocount on
    declare @self int
    select @self = CASE WHEN @loginame is null THEN 1 ELSE 2 END
    -- RESOLVE LOGIN NAME
    if @loginame is null
    select @loginame = suser_sname()
    -- CHECK PERMISSIONS (SecurityAdmin per Richard Waymire) --
    IF (not is_srvrolemember('securityadmin') = 1)
    AND not @self = 1
    begin
    dbcc auditevent (107, @self, 0, @loginame, NULL, NULL, NULL)
    raiserror(15210,-1,-1)
    return (1)
    end
    ELSE
    begin
    dbcc auditevent (107, @self, 1, @loginame, NULL, NULL, NULL)
    end
    -- DISALLOW USER TRANSACTION --
    set implicit_transactions off
    IF (@@trancount > 0)
    begin
    raiserror(15002,-1,-1,'sp_password')
    return (1)
    end
    -- RESOLVE LOGIN NAME (disallows nt names)
    if not exists (select * from master.dbo.syslogins where
    loginname = @loginame and isntname = 0)
    begin
    raiserror(15007,-1,-1,@loginame)
    return (1)
    end
    -- IF non-SYSADMIN ATTEMPTING CHANGE TO SYSADMIN, REQUIRE PASSWORD (218078) --
    if (@self <> 1 AND is_srvrolemember('sysadmin') = 0 AND exists
    (SELECT * FROM master.dbo.syslogins WHERE loginname = @loginame and isntname = 0
    AND sysadmin = 1) )
    SELECT @self = 1
    -- CHECK OLD PASSWORD IF NEEDED --
    if (@self = 1 or @old is not null)
    if not exists (select * from master.dbo.sysxlogins
    where srvid IS NULL and
    name = @loginame and
    ( (@old is null and password is null) or
    (pwdcompare(@old, password, (CASE WHEN xstatus&2048 = 2048 THEN 1 ELSE 0 END)) = 1) ) )
    begin
    raiserror(15211,-1,-1)
    return (1)
    end
    -- CHANGE THE PASSWORD --
    update master.dbo.sysxlogins
    set password = convert(varbinary(256), pwdencrypt(@new)), xdate2 = getdate(), xstatus = xstatus & (~2048)
    where name = @loginame and srvid IS NULL
    -- UPDATE PROTECTION TIMESTAMP FOR MASTER DB, TO INDICATE SYSLOGINS CHANGE --
    exec('use master grant all to null')
    -- FINALIZATION: RETURN SUCCESS/FAILURE --
    if @@error <> 0
    return (1)
    raiserror(15478,-1,-1)
    return (0) -- sp_password

    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    郁闷
    2017-2-13 20:34
  • 签到天数: 44 天

    [LV.5]常住居民I

    发表于 2012-11-9 11:49:19 | 显示全部楼层
    楼主应该把代码设置回复可见,不然看的人多,回复少。
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2022-1-14 21:23
  • 签到天数: 1499 天

    [LV.10]以坛为家III

    发表于 2012-11-11 06:32:43 | 显示全部楼层
    白逸痕 发表于 2012-11-9 11:49
    楼主应该把代码设置回复可见,不然看的人多,回复少。

    没有必要隐藏的,百度下出来N多                                       
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    擦汗
    2024-5-27 14:01
  • 签到天数: 838 天

    [LV.10]以坛为家III

     楼主| 发表于 2013-1-16 13:40:59 | 显示全部楼层
    untitled.JPG


    如果出现截图所示报错,建议将数据做好备份然后进行以下操作:


    错误 0:无法装载 DLL Microsoft提示您请误随意操作SQL数据库 以免对起 数据库造成不必要的麻烦 或该 DLL .
    打开查询分析器,执行以下语句: drop procedure sp_OACreate
    drop procedure xp_dirtree
    drop procedure xp_regwrite
    exec sp_addextendedproc N' sp_OACreate', N'odsole70.dll'
    exec sp_addextendedproc N' xp_dirtree', N' xpstar.dll'
    exec sp_addextendedproc 'xp_regwrite', 'xpstar.dll' 可能会再次出现这样的错误:未能找到存储过程 master.dbo.xp_dirtree|错误2812 再次打开查询分析器,执行以下语句:
    use master
    EXEC sp_addextendedproc xp_dirtree ,@dllname ='xpstar.dll'  

    操作完成如果正常即可,如果还有问题建议卸载当前数据库重新安装。

    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2024-6-4 01:49
  • 签到天数: 2885 天

    [LV.Master]伴坛终老

    发表于 2013-3-27 22:17:28 | 显示全部楼层
    常有种种错误。怎么办啊。。SQL也有权限错误。
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表