Как развернуть SQLPROJ DACPAC в Amazon RDS

Мы всегда занимались проектированием и разработкой базы данных с использованием VS2012 SSDT с использованием расширения.sqlproj и развертывали его на SQL Server с использованием SQLPackage с DACPAC... или альтернативно настраивали правило публикации из Visual Studio.

Мы перенесли нашу базу данных на Amazon RDS SQL Server.

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

Error SQL72014: .Net SqlClient Data Provider: Msg 15151, Level 16, State 1, Line 1 Cannot find the user 'dbo', because it does not exist or you do not have permission.
Error SQL72045: Script execution error.  The executed script:
REVOKE INSERT
    ON OBJECT::[dbo].[table_name] TO [database_role] CASCADE
    AS [dbo];

Я всюду искал, как опубликовать этот тип проекта базы данных в Amazon, и кроме того, что прибегал к поддержке локальной базы данных SQL Server для схемы и покупке Red-Gate SQL Compare для переноса изменений... Я в замешательстве...

Любые предложения будут высоко ценится.

1 ответ

Решение

Ответ прост: мы можем использовать командную строку sqlpackage или функцию публикации sqlproj, чтобы обновить базу данных amazon rds sql таким же образом, как ее можно использовать на любом другом сервере.

Проблемы, с которыми я столкнулся, по-видимому, вызваны тем, что пользователь не объявил и не настроил экземпляр (это наша основная учетная запись для экземпляра Amazon RDS SQL, который вы настраиваете при первом создании экземпляра SQL на Amazon).

Поскольку я не объявил пользователя и его роль в базе данных, его членство в роли db_owner было удалено из базы данных, и после этого оказалось невозможным воссоздать его заново.

Так что - если вы допустили ошибку при развертывании и нарушили ваши разрешения sql dbo для вашей целевой базы данных - решение состоит в том, чтобы зайти в консоль Amazon RDS, найти экземпляр SQL, изменить его и изменить новый мастер-пароль. (даже если он совпадает с существующим), а затем установите флажок внизу, чтобы применить его немедленно. (Это инструкции, предоставленные службой поддержки Amazon - и она работала сегодня утром несколько раз в процессе исследований и проб и ошибок).

Ключевая часть развертывания обновления без нарушения безопасности заключается в следующем.

  1. Я определил второй проект базы данных под названием Master, который используется для настройки конфигурации на уровне сервера. В этом главном проекте я создал 2 пользователей, используя этот синтаксис

    CREATE LOGIN [myusername] with password = 'mypassword';

    • myinstancesa - это то же имя, что и учетная запись sa, которую вы создали при определении экземпляра.
    • myappuser - это пользователь, которого я буду использовать в строке подключения своего приложения, чтобы мое приложение не выполнялось от имени учетной записи sa, и я могу реализовать защиту на уровне базы данных, чтобы принудительно или ограничить возможность приложения по случайному удалению или обновлению определенных таблицы..
  2. В моем основном проекте базы данных - я создаю ссылку на базу данных на Master, и поставьте галочку в поле подавлять ошибки в ссылочных проектах на неразрешенные ссылки.
  3. В моем основном проекте базы данных - я определяю роль приложения, которой я хочу предоставить все права на подключение к своему приложению - например, -myapp_role с использованием этого синтаксиса.

    CREATE ROLE [myapp_role] AUTHORIZATION [dbo];а затем предоставить членство моего пользователя приложения на эту рольEXECUTE sp_addrolemember @rolename = N'myapp_role', @membername = N'myappuser';

  4. Где бы я ни создавал объекты, для которых требуются разрешения, я предоставляю разрешение роли, а не пользователю, это может быть необязательно, но в жизни, отличной от Amazon, это значительно облегчает восстановление и перенастройку безопасности, поскольку роль переносится с помощью резервной копии базы данных / восстановить между серверами. например GRANT INSERT ON OBJECT::[mytable] TO [myapp_role]

  5. В основном проекте базы данных создайте пользователя для представления экземпляра sa userCREATE USER [myinstancesa] FOR LOGIN [myinstancesa] WITH DEFAULT_SCHEMA = dbo

  6. Предоставьте членство в роли пользователя db_owner экземпляру sa - это защита, которую уже имеет ваш пользователь, которую нужно отразить, чтобы предотвратить ее удаление.EXECUTE sp_addrolemember @rolename = N'db_owner', @membername = N'myinstancesa';

  7. Теперь вы можете опубликовать это на целевом сервере или создать dacpac и развернуть его с помощью sqlpackage. Ниже приведена командная строка, которую я использовал. Если вы используете sqlpackage, сделайте снимок основной базы данных, а также основной базы данных.

    sqlpackage.exe /a:Publish /sf:mysnapshot.dacpac /tsn:long.instance.id.and.name.amazon.com /tu:myinstancesa /tp:"password in quotes" /tdn:myTargetDatabaseName /p:DropPermissionsNotInSource=True /p:DropRoleMembersNotInSource=false /p:BlockOnPossibleDataLoss=false /p:DropConstraintsNotInSource=true /p:DropExtendedPropertiesNotInSource=true /p:DropIndexesNotInSource=true /p:DropObjectsNotInSource=true /p:GenerateSmartDefaults=true /p:IgnoreIdentitySeed=true /p:IgnoreIncrement=true /p:IgnoreLoginSids=true /p:IgnoreWithNocheckOnForeignKeys=true /p:VerifyDeployment=true /v:Master=master.dacpac

Файл mysnapshot.dacpac должен быть полным или относительным путем к моментальному снимку, а также вы должны сделать снимок главного проекта и включить полный или относительный путь в качестве последней переменной (не всегда должна быть последней переменной). Tsn - это конечная точка, названная в консоли Amazon, tdn - это имя целевой базы данных и пароль, который я указываю в кавычках, если у вас есть специальные символы или символы пунктуации.

Другие вопросы по тегам