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

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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp