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' ? |