销售热线: 400 6128 608
技术支持:0755-6128 6200
  0755-6128 6600
访客留言板:欢迎留言,我们会尽快给您回复!
一句话留言:
您的联系方式:
软件下载
延伸阅读

未启用对系统目录的特殊更新。系统管理员必须重新配置 SQL Server 以允许这种操作

吴琨(2012-12-18)
        遇到需要在SQL2000中修改登录名sa的密码时,当输入新密码点击“确定”的时候提示“未找到sp_password的存储过程”,我们将sp_password的存储过程粘贴到SQL2000的查询分析器中,运行的时候提示“未启用对系统目录的特殊更新。系统管理员必须重新配置 SQL Server 以允许这种操作”这时应该怎么办呢?
                方法一:重装SQL2000.这是一个非常好的解决方法,但是重装SQL费时费力,还需要提前备份数据库文件,比较麻烦,虽然最后可以成功解决,但是我们不推荐。
                方法二:在查询分析器中执行以下语句:
              第一步
              sp_configure 'allow updates', 0 -- 此时不允许修改值
              sp_configure 'allow updates', 1 --允许对系统表进行修改
              第二步
              RECONFIGURE WITH OVERRIDE -- 更新使用 sp_configure 系统存储过程更改的配置选项的当前配置
            第三步
            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的存储过程。
           第四步
        sp_configure 'allow updates', 0    -- 前面修改为1是允许对系统表进行修改,系统表修改工作结束后,别忘记修改回0,不然会降低安全性。
深圳管易通软件有限公司