Estou tentando conceder a permissão [CONNECT ANY DATABASE] a uma conta SQL específica em várias instâncias. No entanto, um servidor está executando o SQL Server 2012 e essa permissão não foi introduzida até 2014.
Tenho procurado maneiras adicionais de lidar com esse erro específico graciosamente para que o restante do script que concede permissões adicionais seja executado. Atualmente, o script lança um erro de finalização do analisador?.
Aqui está a seção do código com o problema:
IF NOT EXISTS
(
SELECT *
FROM sys.server_permissions AS perm
INNER JOIN sys.server_principals AS prin
ON perm.grantee_principal_id = prin.principal_id
WHERE perm.permission_name = 'CONNECT ANY DATABASE'
AND prin.name = '<ServerPrincipal>'
)
BEGIN
GRANT CONNECT ANY DATABASE TO [<ServerPrincipal>];
END;
O erro é: " Sintaxe incorreta perto de 'CONNECT'. "
Tentei o seguinte, mas não funcionou.
- Usando um bloco TRY-CATCH
- Adicionando lógica adicional à condição IF
AND ( SERVERPROPERTY('servername') <> '<2012ServerName>' )
Finalmente encontrei uma solução viável, mas queria aprender sobre outras maneiras pelas quais as pessoas resolveram um problema semelhante.
IF NOT EXISTS
(
SELECT *
FROM sys.server_permissions AS perm
INNER JOIN sys.server_principals AS prin
ON perm.grantee_principal_id = prin.principal_id
WHERE perm.permission_name = 'CONNECT ANY DATABASE'
AND prin.name = '<ServerPrincipal>'
)
AND ( SERVERPROPERTY('servername') <> '<2012ServerName>' )
BEGIN
DECLARE @String NVARCHAR(150)
SET @String = 'GRANT CONNECT ANY DATABASE TO [<ServerPrincipal>];';
EXEC sp_executesql @Command = @String;
END
Usando SQL dinâmico você pode capturar um erro de sintaxe no lote aninhado. EG