2017-01-16 19 views
1

У меня есть следующий в моем сценарии развертывания записи в Visual Studio 2013:SQL DROP Роль сервера

-- Drop existing role and create again to be up to date 
DROP ROLE payments_data_access_role 
GO 

CREATE ROLE payments_data_access_role 
GO 

Однако, когда я публикую базу данных из VS, я получаю ошибку, что роль «payments_data_access_role» не существует ,

Как я могу переписать это так, чтобы, если роль существует, отбросьте роль, а затем переопределите роль?

спасибо.

UPDATE: Я попытался следующие, и она работала:

IF IS_ROLEMEMBER ('payments_data_access_role') IS NOT NULL 
    DROP ROLE payments_data_access_role 

CREATE ROLE payments_data_access_role 
GO 

Является ли это правильный подход? Не могли бы вы рассказать об этом? Спасибо.

ответ

0

IS_ROLEMEMBER будет работать так, как будто вы его используете.

Для развертывания, я бы просто обернуть его в Try/уловом:

BEGIN TRY 
    PRINT 'Trying to drop role paymens_data_access_role...'; 
    DROP ROLE payments_data_access_role; 
    Print 'Role payments_data_access_role dropped.'; 
END TRY 
BEGIN CATCH 
    PRINT 'Role payments_data_access_role does not exist, not dropping...'; 
END CATCH; 

CREATE ROLE payments_data_access_role; 

Таким образом, вы получаете обратную связь в журнале развертывания и ошибка не останавливает выполнение. Также немного более очевидно, что намерение сравнивается с использованием функции, которая проверяет, принадлежит ли пользователь роли. Возможно, вам станет легче в будущем, когда вам придется вернуться к этому коду через некоторое время или к следующему человеку, который расшифровывает ваш код.

+0

Выглядит очень мило с моей точки зрения. Я согласен со всем, что вы сказали. Спасибо за помощь. – Guygar