【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