2024年2月3日 星期六

[研究]SQL Server 刪除帳號失敗 (登入 'sa2' 的 卸除 失敗。)

[研究]SQL Server 刪除帳號失敗 (登入 'sa2' 的 卸除 失敗。)

2024-02-01

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19

********************************************************************************






===================================

登入 'sa2' 的 卸除 失敗。  (Microsoft.SqlServer.Smo)

------------------------------
如需說明,請按一下: https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=16.200.48053.0&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=卸除+Login&LinkId=20476

------------------------------
程式位置:

   於 Microsoft.SqlServer.Management.Smo.SqlSmoObject.DropImpl(Boolean isDropIfExists, Boolean handleSevereError)
   於 Microsoft.SqlServer.Management.Smo.Login.Drop()
   於 Microsoft.SqlServer.Management.SqlManagerUI.DropObjects.DoDropObject(Int32 objectRowIndex)
   於 Microsoft.SqlServer.Management.SqlManagerUI.DropObjects.DropAllObjects(Boolean stopOnError)

===================================

執行 Transact-SQL 陳述式或批次時發生例外狀況。 (Microsoft.SqlServer.ConnectionInfo)

------------------------------
程式位置:

   於 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType, Boolean retry)
   於 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands, ExecutionTypes executionType, Boolean retry)
   於 Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection queries, Boolean retry)
   於 Microsoft.SqlServer.Management.Smo.SqlSmoObject.ExecuteNonQuery(StringCollection queries, Boolean includeDbContext, Boolean executeForAlter)
   於 Microsoft.SqlServer.Management.Smo.SqlSmoObject.DropImplWorker(Urn& urn, Boolean isDropIfExists)
   於 Microsoft.SqlServer.Management.Smo.SqlSmoObject.DropImpl(Boolean isDropIfExists, Boolean handleSevereError)

===================================

此登入是 1 項作業的擁有者。卸除此登入之前您必須先刪除或重新指派這些作業。 (Framework Microsoft SqlClient Data Provider)

------------------------------
如需說明,請按一下: https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-15170-database-engine-error

------------------------------
伺服器名稱: .
錯誤號碼: 15170
嚴重性: 16
狀態: 1
行號: 2


------------------------------
程式位置:

   於 Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException)
   於 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType, Boolean retry)

這個連結已經不存在,導向到別的網頁

https://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=16.200.48053.0&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=卸除+Login&LinkId=20476
404 - 找不到頁面
https://docs.microsoft.com/sql/relational-databases/errors-events/mssqlserver-15170-database-engine-error

********************************************************************************
ChatGPT
這個錯誤訊息顯示您嘗試刪除一個登入 (Login),但該登入是某些作業的擁有者。在卸除此登入之前,您需要先刪除或重新指派這些作業。
解決方法通常是透過以下步驟進行:
  1. 確認登入所擁有的作業:您需要查詢登入所擁有的作業,以確定它們是什麼以及如何處理它們。
  2. 重新指派或刪除作業:一旦您知道登入擁有的作業,您可以將這些作業重新指派給其他登入或刪除它們(如果它們不再需要)。
  3. 再次嘗試刪除登入:完成上述步驟後,您應該能夠成功刪除該登入。
在執行上述步驟之前,請務必進行備份和確認,以免不小心刪除重要的作業或登入。此外,您可能需要具有相應權限的帳戶才能執行這些操作。
********************************************************************************
如何 "確認登入所擁有的作業" ?
ChatGPT
要確認登入所擁有的作業,您可以執行以下步驟:
1.查詢系統目錄表:使用系統目錄表查詢與登入相關的作業。在 SQL Server 中,系統目錄表存儲了有關伺服器物件的信息,包括登入、作業、角色等。
USE YourDatabaseName;
SELECT * FROM sys.database_principals WHERE type IN ('S', 'U');
這將列出所有 SQL Server 登入和使用者,以及它們的相關資訊,例如名稱、類型等。
敝人:注意 sid 欄位

2.查詢作業:查詢作業表,找出屬於該登入的作業。
USE msdb;
SELECT * FROM sysjobs WHERE owner_sid = (SELECT sid FROM sys.database_principals WHERE name = 'YourLoginName');
這將列出所有屬於特定登入的作業,您可以檢查這些作業的名稱和其他屬性。
敝人:物件名稱 'sysjobs' 無效 (這要 msdb 資料庫才有);資料行名稱 'owner_sid' 無效
敝人:實際檢查 sa2 的 SELECT 是 0 筆

3.檢查 SQL Server 代理工作:如果作業是使用 SQL Server 代理管理的,您還可以查詢 SQL Server 代理工作表。
USE msdb;
SELECT * FROM dbo.sysjobs WHERE owner_sid = (SELECT sid FROM sys.database_principals WHERE name = 'YourLoginName');
這將列出在 SQL Server 代理中屬於該登入的作業。

通過這些查詢,您應該能夠找到與該登入相關的作業,並決定是否重新指派它們或刪除它們。
********************************************************************************
列出某帳號所有作業
USE msdb;
SELECT j.name AS JobName
FROM dbo.sysjobs j
INNER JOIN master.dbo.syslogins l ON j.owner_sid = l.sid
WHERE l.name = 'YourLoginName';


發現是「維護計畫」的「子計畫」是 sa2 帳號相關,所以 sa2 帳號無法刪除。

MaintenancePlan2.Subplan_1

可參考這篇處理,後來 sa2 就順利砍掉了。

[研究]SQL Server的sa帳號改名或關閉,「維護計畫」失敗之解決
https://shaurong.blogspot.com/2024/02/sql-serversa.html


(完)

相關

沒有留言:

張貼留言