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

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

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

  • 写回答

1条回答 默认 最新

  • foolish coder 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 宇视监控服务器无法登录
  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)