Beg*_*DBA 1 sql-server availability-groups sql-server-2014 sql-server-2016
我如何通过更改以下脚本来在启用/未启用 Always ON 的环境中运行。在 Kin 提供了一些非常有用的建议之后,下面似乎正在起作用。但是,当我需要跨 300-400 个 SQL 服务器进行部署时,此代码肯定不会处于最佳状态,而有些总是在其他服务器上没有。
请帮我修改/检查实例是否启用了AG并成功执行
更新根据@Kin 的要求
SET NOCOUNT ON
DECLARE @user_to_be_added sysname
SET @user_to_be_added = 'Domain\user'
DECLARE @sqltext nvarchar(max) = N''
if (select serverproperty('IsHadrEnabled')) = 0
BEGIN
-- change to your user to be added .. make sure that the login is already existing
SELECT @sqltext += char(10)+ 'use '+quotename(name)+';'+char(10)+ 'CREATE USER '+quotename(@user_to_be_added)+' FOR LOGIN '+quotename(@user_to_be_added)
FROM sys.databases where state_desc ='ONLINE' AND databaseproperty(name,'isReadOnly') = 0
SELECT @sqltext
END
Else
BEGIN
SELECT @sqltext += char(10)+ 'use '+quotename(name)+';'+char(10)+ 'CREATE USER '+quotename(@user_to_be_added)+' FOR LOGIN '+quotename(@user_to_be_added)
FROM sys.dm_hadr_availability_replica_states ars
inner join sys.databases dbs ON ars.replica_id = dbs.replica_id
where dbs.state_desc ='ONLINE' AND databaseproperty(dbs.name,'isReadOnly') = 0
and ars.role_desc = 'PRIMARY' -- we want to filter only Primary AG where dbs are writable.
if (@sqltext <> '')
begin
select @sqltext
end
else
begin
print 'There is nothing to print - Probably its Secondary Replica of AG'
end
END
Run Code Online (Sandbox Code Playgroud)
我的理解是你没有以正确的方式接近这个。您只需使用相同的 sid 将登录名复制到所有辅助服务器。用户被复制,因为 db 是 AG 的一部分。
基本上,您希望将在主服务器上创建的登录名创建/复制到 AlwaysON 可用性组拓扑中的所有辅助服务器。
您可以使用 dbatools Sync-DbaAvailabilityGroup来处理
同步可用性组的相关对象。此类对象包括:
SpConfigure
CustomErrors
Credentials
DatabaseMail
LinkedServers
Logins
LoginPermissions
SystemTriggers
DatabaseOwner
AgentCategory
AgentOperator
AgentAlert
AgentProxy
AgentSchedule
AgentJob
Run Code Online (Sandbox Code Playgroud)
请注意,可以排除其中任何一个。
编辑:以下脚本将帮助您:
SET NOCOUNT ON
DECLARE @user_to_be_added sysname
DECLARE @sqltext nvarchar(max) = N''
-- change below to your user to be added .. make sure that the login is already existing
SET @user_to_be_added = 'Domain/Login'
SELECT @sqltext += char(10)+ 'use '+quotename(name)+';'+char(10)+ 'CREATE USER '+quotename(@user_to_be_added)+' FOR LOGIN '+quotename(@user_to_be_added)
FROM sys.dm_hadr_availability_replica_states ars
inner join sys.databases dbs ON ars.replica_id = dbs.replica_id
where dbs.state_desc ='ONLINE' AND databaseproperty(dbs.name,'isReadOnly') = 0
and ars.role_desc = 'PRIMARY' -- we want to filter only Primary AG where dbs are writable.
if (@sqltext <> '')
begin
select @sqltext
end
else
begin
print 'There is nothing to print - @sqltext is blank'
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |