海南省BIM中心

 找回密码
 注册请加微信xycost

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 522|回复: 0

SQL数据库迁移,数据库管理账号恢复解决方法

[复制链接]

0

主题

2825

帖子

2669

积分

论坛游侠

Rank: 1

积分
2669
发表于 2014-6-15 16:36:12 | 显示全部楼层 |阅读模式

SQL数据库迁移,数据库管理账号恢复解决方法一SQL Server数据库恢复或迁移中有用户名但无登录名(孤立账户)的解决方法 (以SQL2005为例说明)案例背景:我将SQL SERVER 2000升级为SQL SERVER 2005后,对原数据库备份文件(.bak)进行数据库还原操作,还原成功后,发现原数据库用户名也被还原了,但该用户名没有登录名(是不能正常登录使用的)。

案例分析:某个数据库的账户只有用户名(数据库用户)而没有登录名(安全性-登录中),是因为这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录,这即是“孤立账户”。

孤立账户的产生情况一般有以下2种情况:1)在其他数据库服务器或SQL SERVER实例中还原数据库备份文件2)重装系统或SQL SERVER之后只还原了用户库,但对应登录名未能还原

解决方法:使用系统存储过程sp_change_users_login修复

1)在SQL Server Management Studio(或SQL查询分析器)中选定对应数据库后执行以下查询语句 exec sp_change_users_login 'REPORT' 列出当前数据库的孤立用户

2)在SQL Server Management Studio(或企业管理器)安全性-登录名下建立一个和原数据库相同的登录名,然后执行以下语句 exec sp_change_users_login 'AUTO_FIX','用户名' 可以自动将用户名所对应的登录名添加到syslogins中
运行成功后显示:

通过更新用户而修复的孤立用户数目为 1。通过添加新登录然后更新用户而修复的孤立用户数目为 0。

使用 exec sp_change_users_login 'Update_ONE','用户名','登录名' 将用户名映射为指定的登录名。

解决方法一

先删除此用户对应的架构,然后在删除对应的用户
步骤
1。SQL SERVER MANAGEMENT STUDIO -> 数据库 -> 安全性 -> 构架,先删除对应的构架
2。SQL SERVER MANAGEMENT STUDIO -> 数据库 -> 安全性 -> 用户,删除对应的用户

解决方法二

–执行如下SQL语句

ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo;
–然后手动删除就可以了。?

在这里又出现构架也删除不了,原因有一个表的构架不是 dbo 了,得改为 dbo 才行。

在数据库testDB中存在架构A及用户A,现将testDB数据库所属的用户由A改为B,同时删除用户A;

架构也由A改为B,删除架构A,操作如下:

1、创建用户B,再创建架构B;

2、将架构A的权限赋给用户B,取消用户A拥有架构A的权限,删除用户A;

3、将数据库的所有属于架构A的对象改为架构B,代码如下:

ALTER SCHEMA [新架构名] TRANSFER 旧架构名.[数据库中的对象表或视图或存储过程]

ALTER SCHEMA [B] TRANSFER A.[对象1]

ALTER SCHEMA [B] TRANSFER A.[对象2]

ALTER SCHEMA [B] TRANSFER A.[对象n] ?

而当要更改一个数据库中全部的表或存储过程时,用上面的方法是可以实现,但是速度太慢了,所以写了一个存储过程批量修改:

改存储过程:

USE [testDemo]
--
--ALTER SCHEMA slqwell TRANSFER
create table #t (
ID   int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1
    procName  varchar(100),  
)
insert into #t(procName)
select   'dbo.' +name   from   sysobjects
where   xtype='P'   and   status>=0
select * from #t
declare @i int
declare @j int
set @j = 1
declare @procName varchar(100)
declare @SchemaTable varchar(200)
while(@j < (@i + 1))
begin
select @procName=procName from #t where ID=@j
set @j = @j + 1
set @SchemaTable = 'ALTER SCHEMA sqlwell TRANSFER ' + @procName
exec (@SchemaTable)
end
drop table #t

其中原来的架构为代表dbo,先的为sqlwell

要修改表的架构时,只要修改上面的xtype='P' 为xtype='U' ?

回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /2 下一条


QQ|小黑屋|手机版|Archiver|ChinaBIM ( 琼ICP备14001050号-1 )

GMT+8, 2024-12-25 12:18 , Processed in 0.025600 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表