Случай MSSQL с ошибкой оператора raiserror? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь проверить, работает ли группа доступности на правильной первичной реплике.

Я хочу создать задание, которое не будет выполнено, если основная реплика не является конкретным сервером.

SELECT CASE 
  WHEN primary_replica != @@SERVERNAME
  THEN  (RAISERROR('Wrong replica', 16, 1))
END 
FROM sys.dm_hadr_availability_group_states States

Я ожидаю, что запрос выдаст ошибку, если первичная реплика не является сервером, на котором выполняется задание. Однако я получаю сообщение об ошибке ниже:

Сообщение 156, уровень 15, состояние 1, строка 3 Неправильный синтаксис рядом с ключевым словом 'RAISERROR.

Сообщение 102, уровень 15, состояние 1, строка 3 Неверный синтаксис рядом с ')'.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вы можете попытаться сделать это на шаге задания SQL, чтобы проверить, является ли основная реплика не конкретным сервером:

DECLARE @ServerName NVARCHAR(256)  = @@SERVERNAME 
DECLARE @RoleDesc NVARCHAR(60)

SELECT @RoleDesc = a.role_desc
    FROM sys.dm_hadr_availability_replica_states AS a
    JOIN sys.availability_replicas AS b
        ON b.replica_id = a.replica_id
WHERE b.replica_server_name = @ServerName

IF @RoleDesc = 'PRIMARY'
BEGIN
    RAISERROR ('Error: Wrong replica',16,1 );
END
0 голосов
/ 10 января 2019

Вы не можете вызвать ошибку в case expression, как это. Вместо этого вы можете использовать EXISTS с IF. Обратите внимание, что это будет работать на серверах, где не было AG тоже ... поэтому, если это не предназначено, вы захотите учесть это.

if exists (SELECT 1 from sys.dm_hadr_availability_group_states where  primary_replica != @@SERVERNAME)
BEGIN
  RAISERROR('Wrong replica', 16, 1)
END 

Для более новых версий вы можете использовать sys.fn_hadr_is_primary_replica

If sys.fn_hadr_is_primary_replica ( db_name() ) <> 1   
BEGIN  
    RAISERROR('Wrong replica', 16, 1)
END  
...