虽然SQL Server现在搬迁的技术越来越多,自带的方法也越来越高级。

但是我们的SQL Server在搬迁的会出现很多孤立用户,微软没有自动的处理。

因为我们的数据库权限表都不会在应用数据库中,但是每次对数据库作迁移的时候,单个数据库却带着它的数据库用户对象。

并且我们在新的数据库机器上也不能登录这些账号,但是它却静悄悄的存在我们的数据库中。

微软以前提供的一个老的接口存储过程来处理这个问题。

sp_change_users_login

将现有数据库用户映射到 SQL Server 登录名。后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 ALTER USER。

虽然每次都在说以后的版本会不支持,但是用了好几个版本还是支持的。

语法:

1
2
3
4
5
sp_change_users_login [ @Action = ] '<EM>action</EM>' 
    [ , [ @UserNamePattern = ] '<EM>user</EM>'
    [ , [ @LoginName = ] '<EM>login</EM>'
    [ , [ @Password = ] '<EM>password</EM>' ]
[;]

参数:

[ @Action = ] 'action'

说明过程要执行的操作。action 的数据类型为 varchar(10)action 可具有下列值之一。

说明

Auto_Fix

将当前数据库的 sys.database_principals 系统目录视图中的用户项链接到同名的 SQL Server 登录名。如果不存在同名的登录名,将会创建一个。检查Auto_Fix 语句的结果,确认实际链接是否正确。在对安全性较为敏感的情况下,要避免使用Auto_Fix

如果使用 Auto_Fix 时登录名尚不存在,则必须指定 userpassword,否则必须指定user,但password 将被忽略。login 必须为 NULL。user 必须是当前数据库中的有效用户。不能将另一个用户映射到该登录名。

Report

列出当前数据库中未链接到任何登录名的用户以及相应的安全标识符 (SID)。userloginpassword 必须为 NULL 或不指定。

Update_One

将当前数据库中的指定 user 链接到现有 SQL Server login。必须指定 userloginpassword 必须为 NULL 或不指定。

[ @UserNamePattern = ] 'user'

当前数据库中的用户名。user 的数据类型为 sysname,默认值为 NULL。

[ @LoginName = ] 'login'

SQL Server 登录的名称。login 的数据类型为 sysname,默认值为 NULL。

[ @Password = ] 'password'

通过指定 Auto_Fix 创建的新 SQL Server 登录名分配的密码。如果已存在匹配的登录名,则映射该用户名与登录名且忽略password。如果不存在匹配的登录名,则 sp_change_users_login 创建新的 SQL Server 登录名并分配password作为新登录名的密码。password 的数据类型为 sysname,且不能为 NULL。

返回代码值:

0(成功)或 1(失败)

结果集:

列名 数据类型 说明

UserName

sysname

数据库用户名。

UserSID

varbinary(85)

用户的安全标识符。

注释:

使用 sp_change_users_login 将当前数据库中的数据库用户链接到 SQL Server 登录名。如果用户登录名已更改,则使用 sp_change_users_login 将用户链接到新的登录,而不会丢失用户的权限。新的login 不能为 sa,而user不能为 dbo、guest 或 INFORMATION_SCHEMA 用户。

sp_change_users_login 不能用于将数据库用户映射到 Windows 级主体、证书或非对称密钥。

sp_change_users_login 不能与通过 Windows 主体创建的 SQL Server 登录名一起使用,也不能与使用 CREATE USER WITHOUT LOGIN 创建的用户一起使用。

不能在用户定义的事务中执行 sp_change_users_login。

权限:

需要 db_owner 固定数据库角色的成员身份。只有 sysadmin 固定服务器角色的成员才能指定 Auto_Fix 选项。

示例:

A. 显示登录映射的当前用户的报告

下例生成当前数据库中的用户及其安全标识符 (SID) 的报告。

  复制代码
1
EXEC sp_change_users_login 'Report';

B. 将数据库用户映射到新的 SQL Server 登录名

在以下示例中,数据库用户与新的 SQL Server 登录名关联。数据库用户 MB-Sales 首先映射到另一个登录名,然后重新映射到登录名MaryB。

  复制代码
1
2
3
4
5
6
7
8
--Create the new login.
CREATE LOGIN MaryB WITH PASSWORD = '982734snfdHHkjj3';
GO
--Map database user MB-Sales to login MaryB.
USE AdventureWorks2008R2;
GO
EXEC sp_change_users_login 'Update_One', 'MB-Sales', 'MaryB';
GO

C. 自动将用户映射到登录名(必要时新建一个登录名)

以下示例显示如何使用 Auto_Fix 将现有用户映射到同名的登录名,以及如何在不存在登录名 Mary 的情况下,创建密码为B3r12-3x$098f6 的 SQL Server 登录名Mary。

实战:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    /*很多做DBA的朋友也許都会碰到一个这样的问题,
    在数据还原到其他服务器时,登录名会丢失,重建非常麻烦,
    特別是数据库用户较多的的情况,其实这个问题解决非常简单,
    sql server 2005 及以前的产品,
    sql server 提供了 sp_change_users_login存储过程,(sql server 2008 须用ALTER USER)
    sp_change_users_login有三种动作:report,update_one和auto_fix
    具体用法:*/
/*1.列出当前数据库中的孤立用戶*/
    exec  sp_change_users_login 'report'
/*2.如果已有登录用戶,将用戶名映射为指定的登录名*/
    exec sp_change_users_login 'UPDATE_ONE','用戶名','登录名'
    or 
    exec sp_change_users_login 'AUTO_FIX','用戶名'
/*3.如果沒有建立登录用戶*/
    exec sp_change_users_login 'Auto_Fix', '登录名', NULL, '登录密码'
/*--相同名字可以使用,处理孤立用户
--在单个数据库上执行*/
    exec sp_change_users_login 'AUTO_FIX','db_writer'
    exec sp_change_users_login 'AUTO_FIX','db_reader'

SQL Server数据库中还原孤立用户的方法集合的更多相关文章

  1. 清空SQL Server数据库中所有表数据的方法(转)

    清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...

  2. 清空SQL Server数据库中所有表数据的方法

    原文:清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...

  3. 在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsoft.sqlserver.smo)

    问题:在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个.必须提供所有成员. (micro ...

  4. (4.21)SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

    转自:指尖流淌 http://www.cnblogs.com/zhijianliutang/p/4100103.html SQL Server数据库启动过程(用户数据库加载过程的疑难杂症) 前言 本篇 ...

  5. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  6. SQL server数据库中的DateTime类型出现的问题

    我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经经常使用到的一种数据类型.而C#语言中也有DateTime类型,尽管二者都是用来描写叙述时间的,可是它们的默认值是不同 ...

  7. SQL Server数据库中的系统数据库?

    SQL Server的系统数据库分为:master,model,msdb和tempdb 1.Master数据库 Master数据库记录SQL Server系统的所有系统级别信息(表sysobjects ...

  8. SQL语句操作SQL SERVER数据库登录名、用户及权限

    要想成功访问 SQL Server 数据库中的数据, 我们需要两个方面的授权: 获得准许连接 SQL Server 服务器的权利: 获得访问特定数据库中数据的权利(select, update, de ...

  9. .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)

    .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...

随机推荐

  1. gnuplotx轴的logscale显示

    假设数据是这样子的: gnuplot脚本如下: set terminal postscript eps color enhanced set log x set log y set format x ...

  2. 【液晶模块系列基础视频】4.4.X-GUI图形界面库-画tab函数简介

    [液晶模块系列基础视频]4.4.X-GUI图形界面库-画tab函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址 ...

  3. POJ 1144 Network(Tarjan求割点)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Descript ...

  4. POJ 2892 Tunnel Warfare(线段树单点更新区间合并)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7876   Accepted: 3259 D ...

  5. 《你不知道的JavaScript》读书笔记(一)作用域

    名词 引擎:从头到尾负责整个 JavaScript 程序的 编译 及 执行 过程. 编译器:负责 语法分析 及 代码生成. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套 ...

  6. PHP生成随机密码的4种方法及性能对比

    PHP生成随机密码的4种方法及性能对比 http://www.php100.com/html/it/biancheng/2015/0422/8926.html 来源:露兜博客   时间:2015-04 ...

  7. Yii源码阅读笔记(十七)

    View.php,继承了component,用于渲染视图文件: namespace yii\base; use Yii; use yii\helpers\FileHelper; use yii\wid ...

  8. ExtJS笔记4 容器与布局(Layouts and Containers)

    The layout system is one of the most powerful parts of Ext JS. It handles the sizing and positioning ...

  9. 树莓派学Python博客收集

    http://www.geekfan.net/8657/  这个博客是控制LED,虽然不是原创地址不是这,但是我觉得排版比较好. http://my.oschina.net/RagingTyphoon ...

  10. C#读取shapefile文件(不用AE)

    1.创建工程文件,选窗体应用程序,命名为:EsriShpReader 2.添加SplitContainer控件到窗体 3.在SplitContainer.panel1中添加两个按钮Button,tex ...