孤立的SQL用户
最近公司很多数据库在上云,也有一部分在下云。这期间出现了很多问题,其中一个比较恶心的问题就是“孤立用户”。当数据库备份还原以后用以前的用户发现不能登录。一开始以为是登录账号没有创建,然后重新创建登录账号,然后再授权给数据库,此时又出错,说用户已经存在。我这才引起注意,开始搜索这个资料,原来这就是因为臭名昭著的孤立用户引起的。 什么是孤立的SQL用户?那么孤立用户又是什么东西那?一个孤立用户就是一个数据库用户,同时没有SQL Server的登录权限。 在实际生产中有很多产生孤立用户的原因,最为主要的方式就是备份还原到不同的服务器实例时。还原数据库的时候回将数据库和用户一同还原到新的数据库上,但是服务器的登录账户却没有一同还原(也不需要这么做)。如果数据库相同服务器那么皆大欢喜,因为用户没有变。如果是不同服务器,此时登录账户中没有了数据库用的名称,即使你创建了相同的名称但是他们的ID也是不同的导致他们不能关联起来。此时就导致了数据库的用户被孤立,也不能访问。此时我们需要做的就是找出孤立用户修改或者删除重建。 下图中是外国网友列出可能的产生孤立用户的原因(很详细): 查找数据库中的孤立用户我打算写一个脚本实现两个主要目的,一是找到一个实例内所有的孤立用户;第二是按需求删除这些用户。从网上找了不少脚本和博客发现都不能实现。所以我自己写了一个亲测可用。这个脚本的麻烦在于当删除用户时,这个用户拥有自己的对象,并且不能drop掉,只能先删除这个对象或者改变对象和用户之间的关系。在下面的例子中所有的用户拥有一个架构,脚本必须去处理这个用户的架构。用脚本实现把孤立用户存储到一个临时表内,然后根据临时表的用户信息删除架构和用户。 查找孤立用户的脚本(, ( (( NOCOUNT sysname, ( , (name,) (name,) name
<span style="color: #0000ff">Insert <span style="color: #0000ff">into #Orphans <span style="color: #0000ff">Exec (<span style="color: #008000">@Qry<span style="color: #000000">) <span style="color: #0000ff">End<span style="color: #0000ff">Select <span style="color: #808080">* <span style="color: #0000ff">from<span style="color: #000000"> #Orphans 如何删除用户(这部分切记酌情使用,先与使用人员或者DBA确认孤立用户已经用了再进行删除。并确认其架构对象不收影响)接着上面的脚本,我们把用户从临时表中取出来进行循环处理。 Select @DDBName = TDBName,@Orphanname = UserName from #OrphansWhere RowID = @From Set @DBSysSchema = '[' + @DDBName + ']' + '.[sys].[schemas]'
End <span style="color: #0000ff">Drop <span style="color: #0000ff">table #Orphans脚本中需要注意的事项首先如果有些数据库的孤立用户不想处理那么在插入临时表时可以提前通过NOT IN语句排除数据库。在删除的孤立用户同时,也会删除孤立用户拥有的架构。需要引起注意。这个脚本将不会检查其他可能被用户拥有的对象。我已经在sql server 2005/2008/2014上进行了测试,请大家知悉。 总结在上云或者数据库迁移的时候一旦发现这类错误往往会出现一些难以预料的问题,我建议。可以先用查询的语句进行查询看看具体哪些用户是孤立用户,哪些需要区别对待,在进行其他处理。脚本是大大减少了自己挨个查询的时间,但是也提高了风险,请大家酌情使用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – 为什么方括号出现在表名中?
- 基于以前的值SQL SERVER 2005进行更新
- 分页-存储过程5种写法 sqlserver分页
- 在linux中导入sql文件的方法分享(使用命令行转移mysql数据库
- sql-server – 通过sql server连接传递租户id
- sql-server – Int主键 – 超出int范围
- f# – SqlDataConnection类型提供程序 – 使用脚本参数设置
- SQL Server sql 存储过程分页代码 支持亿万庞大数据量入门实
- 简单总结db2,sqlserver,oracle,mysql 取数据集中的几条数据
- SQLServer2008聚合的安装测试与卸载
- sql-server – Grant当基表在不同的数据库中时,在
- sql – “select * into table”将它用于将数据插
- DevExpress控件之GridControl控件(代码篇)
- 为什么我们需要像PostMSQL这样的数据库上的Rabbi
- SqlServer 2008 r2 express的自动备份实现
- 在SQL Server中获取子查询值或其他聚合函数的平均
- MSSQLSERVER服务无法启动
- SQLServer2000 中危险存储过程删除及恢复方法
- sql-server – 在NORECOVERY模式下确定数据库的L
- .net – 如何在Entity Frameworks 4.0 Model中指