Ty_FFTQ 2023-06-13 10:07 采纳率: 0%
浏览 6

sqlserver同步登陆账号和代理任务

如果同步用的是mirror 或 always ON,那么登陆账号和代理任务是没办法自动同步的,如果发生切换,则会出现无法连接新主库和没有代理任务的情况。如果在搭建 mirror 或 alwayson 的时候,提前把 登陆账号和代理任务在没有个副本上都创建好的话,可能会避免这个切换连不上的问题。但这种方法也有一个问题,就是如果在使用图中,开发修改了登陆账号密码或修改了代理任务中的执行内容,那么在发生切换后也会有问题。所以我想问的是,有不有什么方法,可以自动同步登陆用户和代理任务?

  • 写回答

1条回答 默认 最新

  • 喝茶品人生 2023-06-13 10:26
    关注

    用powershell同步,这是我的同事编写的一揽子小code:

    
    $connectionString = "Data Source=PRIMARY_SERVER;Initial Catalog=master;Integrated Security=True"
    
    $replicaConnectionStrings = Invoke-Sqlcmd -ConnectionString $connectionString -Query "SELECT replica_server_name, replica_server_url FROM sys.dm_hadr_availability_replica_states WHERE role_desc = 'SECONDARY'" | ForEach-Object { "Data Source=$($_.replica_server_name);Initial Catalog=master;Integrated Security=True" }
    
    $logins = Invoke-Sqlcmd -ConnectionString $connectionString -Query "SELECT name, password_hash, sid, default_database_name, default_language_name FROM sys.server_principals WHERE type_desc = 'SQL_LOGIN'"
    $proxyAccounts = Invoke-Sqlcmd -ConnectionString $connectionString -Query "SELECT name, credential_id, enabled, description, proxy_id, credential_identity, credential_name FROM msdb.dbo.sysproxies"
    
    foreach ($replicaConnectionString in $replicaConnectionStrings) {
        $replicaLogins = Invoke-Sqlcmd -ConnectionString $replicaConnectionString -Query "SELECT name FROM sys.server_principals WHERE type_desc = 'SQL_LOGIN'"
        foreach ($login in $logins) {
            if ($replicaLogins.name -notcontains $login.name) {
                $sql = "CREATE LOGIN [$($login.name)] WITH PASSWORD = '$($login.password_hash)', SID = $($login.sid), DEFAULT_DATABASE = $($login.default_database_name), DEFAULT_LANGUAGE = $($login.default_language_name)"
                Invoke-Sqlcmd -ConnectionString $replicaConnectionString -Query $sql
            }
        }
    }
    foreach ($replicaConnectionString in $replicaConnectionStrings) {
        $replicaProxyAccounts = Invoke-Sqlcmd -ConnectionString $replicaConnectionString -Query "SELECT name FROM msdb.dbo.sysproxies"
        foreach ($proxyAccount in $proxyAccounts) {
            if ($replicaProxyAccounts.name -notcontains $proxyAccount.name) {
                $sql = "EXEC msdb.dbo.sp_add_proxy @proxy_name=N'$($proxyAccount.name)', @enabled=$($proxyAccount.enabled), @description=N'$($proxyAccount.description)', @credential_name=N'$($proxyAccount.credential_name)', @credential_id=$($proxyAccount.credential_id), @credential_identity=$($proxyAccount.credential_identity)"
                Invoke-Sqlcmd -ConnectionString $replicaConnectionString -Query $sql
            }
        }
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 6月13日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助