(5.3.13)sql server修改作业所有者,sql server修改数据库所有者,sql server修改数据库对象所有者

 


【0】无法删除登录名,因为它是对象的所有者

【1】作业所有者

【1.1】作业表与登录名基本信息

(1)查看登录名信息

--登录名表,所有者表
select * from master.dbo.syslogins  
--角色权限关系表
select * from sys.database_principals 

(2)查看作业信息

查询所有作业的表:sysjobs(可以去官网了解文档内容)

select * from msdb.dbo.sysjobs

--其中的sid和所有者表里的owner_sid是一致的

【1.2】查看某个登录名下拥有的作业

(1)查询被废弃的所有者号下的所有作业

--可以用这个先查一遍。
select a.*,b.name from
( 
select * from msdb.dbo.sysjobs where owner_sid<>0x01
) a
left join master.sys.syslogins b on a.owner_sid=b.sid
where b.name like '%这里换成将要删除的帐号%'

【1.3】自动化更新所有涉及到的作业的所有者为sa

复制代码
declare @job_id varchar(300)
select a.job_id into #ttt from
( 
  select name,[enabled],owner_sid,job_id from msdb.dbo.sysjobs where owner_sid<>0x01
) a
left join master.sys.syslogins b on a.owner_sid=b.sid
where b.name is null or b.name like '%这里换成将要删除的帐号%'
while (select count(1) from #ttt)>0
begin
select top 1 @job_id=job_id from #ttt order by job_id asc
declare @sql varchar(500)
select @sql = 'EXEC msdb.dbo.sp_update_job @job_id=N'''+@job_id+''', @owner_login_name=N''sa'''
print (@sql)
exec (@sql)
delete from #ttt where job_id=@job_id
end 
truncate table #ttt
drop table #ttt
复制代码

【2】数据库所有者

--修改数据库dbname的所有者为sa
ALTER AUTHORIZATION ON DATABASE::dbname to [sa];

--修改dbname的所有者为sa
use dbname
sp_changedbowner sa

 

【2.1】查看登录名对应拥有的数据库

-- 查看属于带gg字样登录名的数据库
select
t2.name,t1.* from sys.databases t1 join master.sys.syslogins t2 on t1.owner_sid=t2.sid where t2.name like '%gg%'

【2.2】自动化更新该登录名下所有数据库的拥有者为sa

复制代码
-- 修改对应登录名拥有的数据库所有者为sa
declare
@sql varchar(max) set @sql='' select @sql=@sql+cast('use '+t1.name+';ALTER AUTHORIZATION ON DATABASE::['+t1.name+'] TO [sa];'+char(13) as varchar(max)) from master.sys.databases t1 join master.sys.syslogins t2 on t1.owner_sid=t2.sid where t2.name like '%gg%' print @sql exec(@sql)
复制代码

【3】数据库对象所有者sp_changeobjectowner 

【3.1】单表 

use test;
go

exec sp_changeobjectowner '[db_owner].[T1]','dbo';

执行上面存储过程过后,表对象T1的所有者(owner)就从db_owner改为了dbo了。

【3.2】所有表

如果一个数据库里面的表对象非常多,那么使用该方法就非常的繁琐了。此时就可以使用sp_MSforeachtable来批量处理该工作。

use test;
go
 
exec sp_MSforeachtable 'exec sp_changeobjectowner ''?'',''dbo'' '

【3.3】所有数据库对象

复制代码
declare tb cursor local for
 
select 'sp_changeobjectowner ''['+replace(user_name(uid),']',']]')+'].[' 
+replace(name,']',']]')+']'',''dbo'''
from sysobjects
where xtype in('U','V','P','TR','FN','IF','TF') and status>=0
 
open tb
declare @s nvarchar(4000)
fetch tb into @s 
    while @@fetch_status=0 
    begin 
        exec(@s) 
        fetch tb into @s
    end
close tb
 
deallocate tb
go            
复制代码

【3.4】修改数据库对象所有者的注意事项

可能会导致视图、存储过程出现问题

  

 

【3.5】使用 alter schema 修改数据库对象所有者

ALTER SCHEMA dbo TRANSFER db_owner.T1;

 

 

【参考文档】

【3】中引用自:https://www.cnblogs.com/kerrycode/p/4314651.html?utm_source=tuicool&utm_medium=referral

posted @   郭大侠1  阅读(1215)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示