Sql-Server-2014
SQL Server 可用性組不會自動更新數據庫所有者
這週我學到了一個慘痛的教訓。事實證明,雖然表更新/模式更新確實在可用性組上的數據庫之間複製,但更改主副本上的數據庫所有者並不會自動更改輔助副本上的數據庫所有者。
因此,如果您執行故障轉移,數據庫所有者現在可能與主表的 SID 不同步。
在進行安全相關更改時,我的行動計劃是否應該是
1. Apply change to primary replica 2. Fail over the Availability Group 3. Apply change to the new primary replica
我做出這些陳述是否正確?當我進行更改時,我必須注意的只是 DBOwner/Schema 更改嗎?
是的,您需要確保數據庫具有相同的所有者,架構更改將沿著可用性組進行。當數據庫所有者發生更改時,這會出現問題,因為您需要將這些更改也重新應用到輔助節點。
如果可能,您可以在每個數據庫上將所有者更改為 SA,然後在每晚以及發生故障轉移時進行此更改。當您擷取故障轉移時,您可以執行此命令以使每個數據庫的 SA 所有者:
EXEC sp_MSforeachdb 'ALTER AUTHORIZATION ON DATABASE::? TO SA';
編輯:
如果您不想將 SA 作為所有者,您可以創建包含數據庫所有者的表
CREATE TABLE DatabaseInAvailabilityGroup.dbo.dbownersMaintenance ( id INT IDENTITY(1,1), dbname NVARCHAR(100) NOT NULL, username NVARCHAR(100) NOT NULL );
填滿桌子(把它作為一項工作,每小時安排一次或其他什麼)
DELETE FROM DatabaseInAvailabilityGroup.dbo.dbownersMaintenance; INSERT INTO DatabaseInAvailabilityGroup.dbo.dbownersMaintenance SELECT db.name, sl.name FROM master.sys.databases db INNER JOIN master.sys.syslogins sl ON db.owner_sid = sl.sid;
一旦發生故障轉移,就需要在新的活動節點上執行:
DECLARE @maxRow INT, @currentRow INT, @sql NVARCHAR(MAX), @dbname NVARCHAR(100), @owner NVARCHAR(85); SELECT @maxRow = MAX(id), @currentRow = MIN(id) FROM DatabaseInAvailabilityGroup.dbo.dbownersMaintenance; WHILE @maxRow >= @currentRow BEGIN SELECT @dbname = dbname, @owner = username FROM DatabaseInAvailabilityGroup.dbo.dbownersMaintenance WHERE id = @currentRow; SET @sql = 'ALTER AUTHORIZATION ON DATABASE::'+@dbname+' TO ['+@owner+']'; EXECUTE (@sql); SET @currentRow = @currentRow+1; END