AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 174946
Accepted
Randy Minder
Randy Minder
Asked: 2017-05-31 11:41:59 +0800 CST2017-05-31 11:41:59 +0800 CST 2017-05-31 11:41:59 +0800 CST

在 AlwaysOn 副本上创建 SQL 登录名和用户

  • 772

我有一个数据库(DB1),它同步到另一台服务器上的(DB2)(通过 AlwaysOn - SQL Server 2014)。

我想授予用户对 DB2 的读取权限。我在 DB1 中创建了一个 SQL 登录名和数据库用户。新的数据库用户迁移到 DB2,但 SQL 登录没有(这是有道理的)。

问题是,当我尝试在 DB2 上为用户创建 SQL 登录名并授予用户对 DB2 的读取权限时,与来自 DB1 的用户帐户相关联,我收到一条错误消息,指出 DB2 是只读的,无法修改。

那么,我该如何实现呢?

sql-server availability-groups
  • 5 5 个回答
  • 17690 Views

5 个回答

  • Voted
  1. Best Answer
    Tara Kizer
    2017-05-31T11:47:09+08:002017-05-31T11:47:09+08:00

    您需要在 DB2 服务器上创建登录。使用Robert 的脚本来获取 sid 和密码,如果它是 SQL 帐户的话。

    然后授予对 DB1 的权限。由于 AG,该权限将自动神奇地复制到 DB2。

    没有办法只授予对 DB2 的权限。它必须在 DB1 上完成。不过,您可以通过禁用 DB1 上的登录来控制访问。

    • 8
  2. user507
    2017-05-31T16:08:36+08:002017-05-31T16:08:36+08:00

    如果需要,一种自动同步您的 AG 副本之间的登录的选项,但也可以用作一次性的事情。

    dbatools是一个模块,它提供了一些用于迁移 SQL Server 实例的代码,但我过去常常也让 AG 副本保持同步。

    您需要简单同步登录的主要功能是Copy-SqlLogin. 这将包括通过 SSMS(数据库映射等)看到的 SID、密码和其他属性。Tara 引用的脚本具有类似的功能。

    Copy-SqlLogin -Source DB1 -Destination DB2 -SyncOnly
    

    仅该命令就会将登录信息从 DB1 复制到 DB2 并简单地同步任何更改的内容。因此,假设您将另一个数据库添加到 AG 并授予登录访问权限(映射用户),那么下次运行上述命令时,它将为您更新 DB2 上的登录。

    为了完整起见,包含以下脚本只是为了显示可以做什么。我在客户端的 4 节点 AG 上构建了以下流程作为计划任务。如果您需要,这还提供了排除副本的能力;这是他们需要的东西。

    #+++For debug just remove the "ErrorAction" and "WarningAction" parameters from the command+++
    $localServerName = 'DB1'
    $AGName = 'AG1'
    $replicaExclude = 'DB3'
    $excludeJobList = 'syspolicy_purge_history','DatabaseBackup - SYSTEM_DATABASES - FULL','DatabaseBackup - USER_DATABASES - DIFF','DatabaseBackup - USER_DATABASES - FULL','DatabaseBackup - USER_DATABASES - LOG'
    $logfile = 'C:\Scripts\SyncProcess.log' 
    
    # Where I had stored the module on the client computer
    Import-Module 'C:\Scripts\dbatools\dbatools.psm1'
    
    if (Test-Path $logfile) {Remove-Item $logfile -Force}
    Start-Transcript -Path $logfile -Force -NoClobber
    
    $r = Get-SqlAvailabilityGroup -SqlServer $localServerName -AvailabilityGroupname $AGName -IsPrimary
    if ($r)
    {
        $srvs = (Get-SqlAvailabilityGroup -SqlServer $localServerName -AvailabilityGroupname $AGName | where {$_.ReplicaName -ne $localServerName -and $replicaExclude -NotContains $_.ReplicaName}).ReplicaName
        foreach ($s in $srvs)
        {
            Write-Host "Working on $s" -ForegroundColor Red
            #Copy logins to destination, ignoring errors and warning messages to keep output low
            Copy-SqlLogin -Source $localServerName -Destination $s -SyncOnly -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
    
            #copy operators
            Copy-SqlOperator -Source $localServerName -Destination $s
    
            #Copy jobs to destination
            Copy-SqlJob -Source $localServerName -Destination $s -Force -Exclude $excludeJobList
        }
    }
    Stop-Transcript
    
    • 2
  3. sepupic
    2017-05-31T12:12:39+08:002017-05-31T12:12:39+08:00

    您说您刚刚在第一台服务器上创建了登录,并将相应的用户迁移到 DB2。因此,您只需在第二台服务器上创建相同的登录名并保留它的 sid,您可以先从 sys.server_principals 复制登录名的 sid,然后使用with sid创建相同的登录名,如下所示:

    create login my_login with password = '*****', sid = 0x6E94CADC0A6EEC439B620643CDDB5C71 -- put here your login's sid 
    
    • 1
  4. Masood Hashim
    2017-06-01T00:01:50+08:002017-06-01T00:01:50+08:00

    当您在第二台服务器上创建相同的登录时,您必须确保使用与在主服务器上创建的相同的 SID 和密码来创建它。下面列出了我遵循的步骤:

    • 在主副本的主数据库上部署以下链接中提供的 2 个存储过程(sp_hexadecimal 和 sp_help_revlogin)——这些 SP 将帮助生成登录创建脚本,然后可以在辅助副本上运行
      • https://support.microsoft.com/en-us/help/918992/how-to-transfer-logins-and-passwords-between-instances-of-sql-server
    • 在主副本上创建新登录
    • 执行以下存储过程,该过程是在步骤 1 中创建的,将“登录名”传递给它

              EXEC sp_help_revlogin 'Login_Name'
      
    • 复制上一步生成的脚本并在Secondary副本上执行

    • 1
  5. swasheck
    2017-05-31T12:12:29+08:002017-05-31T12:12:29+08:00

    我相信这就是部分遏制旨在解决的问题。

    请注意,如果您选择使用部分包含的数据库,有很多注意事项。

    以下是您如何使用主节点进行设置(请记住在非生产环境中进行测试,以便您了解生产环境如何响应上述注意事项列表)。

    use master;
    go
    sys.sp_configure 'contained database authentication',1;
    go
    reconfigure with override;
    go
    
    use master;
    go
    alter database DB1 set containment = partial;
    go
    
    
    use DB1
    go
    create user test with password=N'#c0n+@Ined!';
    go
    use DB1
    go
    alter role db_datareader add member test;
    go
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve