我需要为我的 SQL Server 实例中所有用户定义的服务器角色获取一个脚本,并为其分配权限,如下所示:
GRANT ALTER ANY AVAILABILITY GROUP TO [ServerRole1]
到目前为止我所做的是:
SELECT ' GRANT ' + SPerm.permission_name + ' TO ' + SP.name -- + ' '' ' AS Commands_To_Execute
FROM sys.server_principals SP
JOIN sys.server_permissions SPerm
ON SP.principal_id = SPerm.grantee_principal_id
where sp.type='R' and sp.name!='public'
但我在 SELECT 语句第 1 列的添加运算符中收到错误无法解决“SQL_Latin1_General_CP1_CI_AS”和“Latin1_General_CI_AS_KS_WS”之间的排序规则冲突。
然后我尝试如下解决它我收到错误“表达式类型 int 对于 COLLATE 子句无效”:
SELECT ' GRANT ' + SPerm.permission_name + ' TO ' + SP.name -- + ' '' ' AS Commands_To_Execute
FROM sys.server_principals SP
JOIN sys.server_permissions SPerm
ON SP.principal_id collate SQL_Latin1_General_CP1_CI_AS = SPerm.grantee_principal_id collate SQL_Latin1_General_CP1_CI_AS
where sp.type='R' and sp.name!='public'
在这种情况下,问题不在于联接,而在于文本连接。
以下应该工作
顺便说一句,我强烈建议您查看 DBATools 中的 Copy- DBAServerRole Powershell cmdlet,它是一个 Powershell 模块 - 它可以为您完成此类工作的繁重工作。