我正在寻找一种方法来在他们自己启动密码更改时跨 AG 同步用户。
从历史上看(在设置 AG 之前),他们可以使用命令行,或者对于应用程序用户,他们可以访问代表他们发出 sp_password 的 Web 前端;这很优雅,因为它以用户身份连接,并且 Web 服务器端不需要在其上设置提升的权限。用户的默认数据库现在位于 AG 中,密码更改在主数据库上成功,但在辅助数据库上失败,因为数据库不可访问。
我尝试将用户的默认数据库临时更改为 master(在 AG 中无法将其添加回来)、永久(某些应用程序希望默认为自己的数据库),并在连接时修改 CGI 以使用 master 作为数据库(在主要工作,在次要失败)。
我可以找到有关第一次同步用户的文档(对此没有任何问题),但是很难找到有关用户如何在 AG 中更改自己的密码的任何信息,因为他们只被允许连接到主服务器。
有任何想法吗?如果它非常明显和令人尴尬,我仍然会很感激。
编辑:我的意思是添加:我可以创建一个具有提升权限的用户(可能“更改任何用户”)来更改用户的密码或复制 password_hash,但我被要求尝试限制在网络服务器端,如果可能的话。
谢谢。
密码存储在主数据库中,无需连接到辅助数据库中的该数据库。除非数据库是包含数据库,否则服务器登录信息也存储在主数据库中。包含的数据库会照顾自己,因为包含的用户可以“登录”并“包含”在数据库中,因此会自动包含在内。
如果您使用 must_change 或密码策略,您将引发事件或返回有关此的消息,并且可以通过编程方式执行此操作。
例如:https ://technet.microsoft.com/en-us/library/ms131024(v=sql.110).aspx
想到几个:
使用服务器端跟踪和/或扩展事件还有其他组合,但它们都归结为大致相同的过程。
我最近刚刚在一个客户那里解决了同样的问题,我在博客上写了这个解决方案。
它的简短版本是:我设置了一个在每个副本上运行的存储过程,通过链接服务器连接到主副本以检索登录 SID 和密码哈希,并将这些应用于必要的辅助副本。
SID(帐户的唯一标识符)是将登录名(服务器主体)连接到用户(数据库主体)的原因,因此如果您要在辅助副本上创建新登录名,则需要自带SID 与你,所以登录和用户匹配。
SID 可以在 中找到
sys.server_principals
,散列密码可以在 中找到sys.sql_logins
。这两个表由sid
列连接。解决您的安全问题:客户端应用程序本身永远无权执行此操作。相反,我正在运行一个 SQL Server 代理作业,该作业对一组非常严格的权限进行操作。同步不会立即发生,因为它是计划好的,所以您要么必须将作业设置为相对频繁地运行,要么像@SeanGallardy 建议的那样提供某种类型的 DDL 触发器。
免责声明:未经测试,请勿在互联网上使用陌生人的 T-SQL 代码。我正在尽最大努力提供它。