declare sql语句_Sql Server中孤立的SQL用户查找和删除

news/2024/7/5 5:22:56

问题

最近公司很多数据库在上云,也有一部分在下云。这期间出现了很多问题,其中一个比较恶心的问题就是“孤立用户”。当数据库备份还原以后用以前的用户发现不能登录。一开始以为是登录账号没有创建,然后重新创建登录账号,然后再授权给数据库,此时又出错,说用户已经存在。我这才引起注意,开始搜索这个资料,原来这就是因为臭名昭著的孤立用户引起的。

什么是孤立的SQL用户?

那么孤立用户又是什么东西那?一个孤立用户就是一个数据库用户,同时没有SQL Server的登录权限。

在实际生产中有很多产生孤立用户的原因,最为主要的方式就是备份还原到不同的服务器实例时。还原数据库的时候回将数据库和用户一同还原到新的数据库上,但是服务器的登录账户却没有一同还原(也不需要这么做)。如果数据库相同服务器那么皆大欢喜,因为用户没有变。如果是不同服务器,此时登录账户中没有了数据库用的名称,即使你创建了相同的名称但是他们的ID也是不同的导致他们不能关联起来。此时就导致了数据库的用户被孤立,也不能访问。此时我们需要做的就是找出孤立用户修改或者删除重建。

下图中是外国网友列出可能的产生孤立用户的原因(很详细):

75708a108223ec3ec86fa272ab018a3d.png

查找数据库中的孤立用户

我打算写一个脚本实现两个主要目的,一是找到一个实例内所有的孤立用户;第二是按需求删除这些用户。从网上找了不少脚本和博客发现都不能实现。所以我自己写了一个亲测可用。这个脚本的麻烦在于当删除用户时,这个用户拥有自己的对象,并且不能drop掉,只能先删除这个对象或者改变对象和用户之间的关系。在下面的例子中所有的用户拥有一个架构,脚本必须去处理这个用户的架构。用脚本实现把孤立用户存储到一个临时表内,然后根据临时表的用户信息删除架构和用户。

查找孤立用户的脚本

Use masterGoCreate Table #Orphans  ( RowID int not null primary key identity(1,1) , TDBName varchar (100), UserName varchar (100), UserSid varbinary(85) )SET NOCOUNT ON  DECLARE @DBName sysname, @Qry nvarchar(4000) SET @Qry = '' SET @DBName = '' WHILE @DBName IS NOT NULL BEGIN SET @DBName =  ( SELECT MIN(name)  FROM master..sysdatabases  WHERE /** to exclude named databases add them to the Not In clause **/ name NOT IN  ( 'model', 'msdb',  'distribution' ) And  DATABASEPROPERTY(name, 'IsOffline') = 0  AND DATABASEPROPERTY(name, 'IsSuspect') = 0  AND name > @DBName ) IF @DBName IS NULL BREAK  Set @Qry = 'select ''' + @DBName + ''' as DBName, name AS UserName,  sid AS UserSID from [' + @DBName + ']..sysusers  where issqluser = 1 and (sid is not null and sid <> 0x0)  and suser_sname(sid) is null order by name' Insert into #Orphans Exec (@Qry)  EndSelect * from #Orphans

如何删除用户(这部分切记酌情使用,先与使用人员或者DBA确认孤立用户已经用了再进行删除。并确认其架构对象不收影响)

接着上面的脚本,我们把用户从临时表中取出来进行循环处理。

Declare @SQL as varchar (200)Declare @DDBName varchar (100)Declare @Orphanname varchar (100)Declare @DBSysSchema varchar (100)Declare @From intDeclare @To intSelect @From = 0, @To = @@ROWCOUNT from #Orphans--Print @From--Print @ToWhile @From <= @To Begin Set @From = @From + 1  Select @DDBName = TDBName, @Orphanname = UserName from #Orphans Where RowID = @From  Set @DBSysSchema = '[' + @DDBName + ']' + '.[sys].[schemas]' print @DBsysSchema Print @DDBname Print @Orphanname set @SQL = 'If Exists (Select * from ' + @DBSysSchema  + ' where name = ''' + @Orphanname + ''') Begin Use ' + @DDBName  + ' Drop Schema [' + @Orphanname + '] End' print @SQL Exec (@SQL)  Begin Try Set @SQL = 'Use ' + @DDBName  + ' Drop User [' + @Orphanname + ']' Exec (@SQL) End Try Begin Catch End Catch  End Drop table #Orphans

脚本中需要注意的事项

首先如果有些数据库的孤立用户不想处理那么在插入临时表时可以提前通过NOT IN语句排除数据库。在删除的孤立用户同时,也会删除孤立用户拥有的架构。需要引起注意。这个脚本将不会检查其他可能被用户拥有的对象。我已经在sql server 2005/2008/2014上进行了测试,请大家知悉。

总结

在上云或者数据库迁移的时候一旦发现这类错误往往会出现一些难以预料的问题,我建议。可以先用查询的语句进行查询看看具体哪些用户是孤立用户,哪些需要区别对待,在进行其他处理。脚本是大大减少了自己挨个查询的时间,但是也提高了风险,请大家酌情使用。


http://www.niftyadmin.cn/n/3879802.html

相关文章

Hook钩子攻略 选择自 Gongnanpi 的 Blog

一。写在最前本文的内容只想以最通俗的语言说明钩子的使用方法&#xff0c;具体到钩子的详细介绍可以参照下面的网址&#xff1a; http://www.microsoft.com/china/community/program/originalarticles/techdoc/hook.mspx二。了解一下钩子 从字面上理解&#xff0c;钩子就是想钩…

quartz可以指定方法名吗_柴犬可以剃毛吗?柴犬掉毛及应对方法

点击蓝字关注“柴犬大队”&#xff0c;时刻掌握最新动态&#xff01;柴犬属于双层毛的犬类&#xff0c;外层是粗硬的起保护作用的被毛&#xff0c;里层是细软的底毛&#xff0c;在春夏交接之时&#xff0c;柴柴会褪掉里层的底毛&#xff0c;只留下外层的保护毛。那么&#xff0…

VS中资源文件的使用心得,建议关注! 选择自 smallmark 的 Blog

假设有两个文件&#xff1a;main.exe 和 lib.dllmain.exe调用lib.dll中的某个类在lib.dll中使用 Assembly.GetExecutingAssembly 得到的将是指向 lib.dll 的Assembly 如果使用 Assembly.GetEntryAssembly 得到的将是指向 main.exe 的Assembly还有一个问题值得关注&#…

学python编程好就业吗_学Python人工智能开发?有没有前途

学python人工智能开发?有没有前途?近两年来&#xff0c;由于语音技术、人工智能发展&#xff0c;以及亚马逊、Google 等厂商积极推动技术在商业落地的情况下语音 AI 各方面的潜力正在逐步被挖掘出来。学细心的同学们都会发现&#xff0c;从我们日常用的智能音箱&#xff0c;到…

新增加的HTML扩充

新增加了一些HTML扩充以支持样式表。这些扩充允许在HTML文档中包含样式表&#xff0c;允许HTML文档链接外部样式表&#xff0c;允许CSS规则与某一类单元相关联。仅少数HTML扩充是必须的&#xff1a;三个新单元&#xff1a; STYLE、 SPAN 和具有属性 REL"stylesheet"…

3变量程序_只会G代码,不会宏程序就别说你是数控师傅

一、变量普通加工程序直接用数值指定G代码和移动距离&#xff1b;例如&#xff0c;GO1和X100.0。使用用户宏程序时&#xff0c;数值可以直接指定或用变量指定。当用变量时&#xff0c;变量值可用程序或用MDI面板上的操作改变。例如&#xff1a;&#xff03;1&#xff1d;&#…

Visual Studio .Net团队开发[转]

一、 开发前的准备1、 在装有Windows 2000或者Windows XP Professional的机器上安装.Net Framework SDK、Visual Studio.Net、Visual Source Safe 6C。&#xff08;如果用户操作系统是Windows .Net Server&#xff0c;则无须安装.Net Framework SDK&#xff0c;.Net Server自带…

python文字游戏源代码_python 像素小鸟小游戏源码(flappybird)

【实例简介】 像素小鸟这个简单的游戏于2014年在网络上爆红&#xff0c;游戏上线一段时间内appleStore上的下载量一度达到5000万次&#xff0c;风靡一时 【实例截图】【核心代码】 from Class import * # 检查停止事件 def checkEvent(): time.sleep(0.1) press pygame.key.ge…