数据库升级到 mssql 2005 了,我对 2005 不熟悉,发现还原 2000 的数据以前的用户名删除不了,报 microsoft sql server错误: 15138。
在网上找到:sql server 2005删除用户失败解决方法(15138错误)
microsoft sql server错误: 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除。
删除 对于 用户“*****”失败。 (microsoft.sqlserver.smo)
其他信息:
执行 transact-sql 语句或批处理时发生了异常。 (microsoft.sqlserver.connectioninfo)
解决方法一
先删除此用户对应的架构,然后在删除对应的用户
步骤
代码如下 复制代码
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 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'