Как развернуть 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 - и она работала сегодня утром несколько раз в процессе исследований и проб и ошибок).
Ключевая часть развертывания обновления без нарушения безопасности заключается в следующем.
Я определил второй проект базы данных под названием Master, который используется для настройки конфигурации на уровне сервера. В этом главном проекте я создал 2 пользователей, используя этот синтаксис
CREATE LOGIN [myusername] with password = 'mypassword';
- myinstancesa - это то же имя, что и учетная запись sa, которую вы создали при определении экземпляра.
- myappuser - это пользователь, которого я буду использовать в строке подключения своего приложения, чтобы мое приложение не выполнялось от имени учетной записи sa, и я могу реализовать защиту на уровне базы данных, чтобы принудительно или ограничить возможность приложения по случайному удалению или обновлению определенных таблицы..
- В моем основном проекте базы данных - я создаю ссылку на базу данных на Master, и поставьте галочку в поле подавлять ошибки в ссылочных проектах на неразрешенные ссылки.
В моем основном проекте базы данных - я определяю роль приложения, которой я хочу предоставить все права на подключение к своему приложению - например, -myapp_role с использованием этого синтаксиса.
CREATE ROLE [myapp_role] AUTHORIZATION [dbo];
а затем предоставить членство моего пользователя приложения на эту рольEXECUTE sp_addrolemember @rolename = N'myapp_role', @membername = N'myappuser';
Где бы я ни создавал объекты, для которых требуются разрешения, я предоставляю разрешение роли, а не пользователю, это может быть необязательно, но в жизни, отличной от Amazon, это значительно облегчает восстановление и перенастройку безопасности, поскольку роль переносится с помощью резервной копии базы данных / восстановить между серверами. например
GRANT INSERT ON OBJECT::[mytable] TO [myapp_role]
В основном проекте базы данных создайте пользователя для представления экземпляра sa user
CREATE USER [myinstancesa] FOR LOGIN [myinstancesa] WITH DEFAULT_SCHEMA = dbo
Предоставьте членство в роли пользователя db_owner экземпляру sa - это защита, которую уже имеет ваш пользователь, которую нужно отразить, чтобы предотвратить ее удаление.
EXECUTE sp_addrolemember @rolename = N'db_owner', @membername = N'myinstancesa';
Теперь вы можете опубликовать это на целевом сервере или создать 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 - это имя целевой базы данных и пароль, который я указываю в кавычках, если у вас есть специальные символы или символы пунктуации.