解决还原数据库产生的孤立用户问题

2024-04-17 01:32

本文主要是介绍解决还原数据库产生的孤立用户问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

孤立用户是指脱离了登录,独立存在于数据库中的用户  
关于孤立用户的产生原因及解决办法,参考sql联机丛书"孤立用户"部分  
联机帮助上是删除孤立用户,但还有没有其他办法呢?  
   
   
   
  --在master中创建此存储过程,然后调用此存储过程即可(注意参数为要解决孤立用户的数据库名)  
   
  if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[p_validatelogin]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[p_validatelogin]  
  GO  
   
  /*--解决还原数据库产生的孤立用户问题  
     
    孤立用户是指脱离了登录,独立存在于数据库中的用户  
    关于孤立用户的产生原因及解决办法,参考sql联机丛书"孤立用户"部分  
    联机帮助上是删除孤立用户  
   
    本存储过程通过另一方法来解决此问题:  
      搜索指定数据库中的系统表  
      如果孤立用户的登录已经存在,则通过修改系统表来重新建立登录与用户之间的联系  
      如果孤立用户的登录不存在,则为它建立一个登录      
   
    存储过程处理了两种情况:  
    一种情况是在还原数据库前已经创建了登录  
      但还原数据库后,无法用该登录访问还原的数据库  
    另一种情况是,当前sql实例中,没有还原数据库中的登录用户  
   
  --邹建   2004.07(引用请保留此信息)--*/  
   
  /*--调用示例  
     
    exec   p_validatelogin   'db_test'  
  --*/  
  create   proc   p_validatelogin  
  @dbname   sysname   --孤立用户所在的数据库名(存储过程自动搜索此库中的孤立用户进行解决)  
  as  
  if   db_id(@dbname)   is   null  
  begin  
    print   '无此数据库'  
    return  
  end  
   
  declare   @s   nvarchar(4000)  
   
  --更新已经有登录,但   sid   不匹配的用户的sid  
  set   @s='update   a   set   sid=b.sid  
  from   ['+replace(@dbname,']',']]')+'].dbo.sysusers   a    
    join   master.dbo.syslogins   b   on   a.name=b.name  
  where   a.islogin=1   and   a.sid<>b.sid'  
  exec   sp_configure   'allow   updates',1   reconfigure   with   override  
  exec   sp_executesql   @s  
  exec   sp_configure   'allow   updates',0   reconfigure   with   override  
   
  --为不存在的登录添加登录信息  
  set   @s='declare   @sid   binary(16),@loginame   sysname  
    declare   tb   cursor   local   for  
    select   name,sid   from   ['+replace(@dbname,']',']]')  
    +'].dbo.sysusers   a  
    where   islogin=1   and   name   not   in(''dbo'',''guest'')   and   not   exists(  
      select   1   from   master.dbo.syslogins  
      where   name=a.name)  
    open   tb  
    fetch   tb   into   @loginame,@sid  
    while   @@fetch_status=0  
    begin  
      exec   sp_addlogin   @loginame=@loginame,@sid=@sid  
      fetch   tb   into   @loginame,@sid  
    end  
    close   tb  
    deallocate   tb'  
    exec   sp_executesql   @s  
  go  
   
   
   
  先增加一个SQL   SERVER登录loginname,如果有就不要加了。  
   
  然后运行存储过程:  
  sp_change_users_login   'update_one','数据库用户名','SQL   SERVER登录名'   
 

这篇关于解决还原数据库产生的孤立用户问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910451

相关文章

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma