如何将SQLPROJ DACPAC部署到Amazon RDS

Jam*_*eck 5 amazon-web-services amazon-rds sqlproj sqlpackage sql-server-data-tools

我们一直使用.sqlproj扩展使用VS2012 SSDT进行数据库设计和开发,并使用带有DACPAC的SQLPackage部署到SQL Server ...或者从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];
Run Code Online (Sandbox Code Playgroud)

我到处搜索了如何将这种类型的数据库项目发布到亚马逊,除了为模式维护本地SQL Server数据库并购买Red-Gate SQL Compare以迁移更改..我很难过...

任何建议将不胜感激.

Jam*_*eck 6

简单的答案是我们可以使用sqlpackage命令行或sqlproj Publish函数来更新amazon rds sql数据库,就像在任何其他服务器上使用它一样.

我遇到的问题似乎是由于没有声明和配置实例sa用户(我们在您首次在Amazon上创建SQL实例时设置的Amazon RDS SQL实例的主sa帐户)引起的.

因为我没有在数据库中声明用户及其角色成员资格,所以db_owner角色的成员资格已从数据库中删除,之后似乎无法重新创建.

所以 - 如果你在部署中犯了错误并破坏了对目标数据库的sql dbo权限 - 解决方案是进入Amazon RDS控制台,找到SQL实例,修改实例,并更改设置新的主密码(即使它与现有的相同),然后勾选底部的框以立即应用.(这是亚马逊支持团队提供的说明 - 今天早上在我的研究试验和错误过程中已多次工作......).

在不破坏安全性的情况下部署升级的关键部分如下.

  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. 无论我在哪里创建需要权限的对象,我都授予角色权限,而不是用户权限,这可能不是必需的,但在非亚马逊生活中,随着角色与数据库备份一起传输,它使得恢复和重新配置安全性变得更加容易.在服务器之间恢复 例如GRANT INSERT ON OBJECT::[mytable] TO [myapp_role]

  5. 在主数据库项目中,创建用户以表示实例sa用户 CREATE 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是在亚马逊控制台中命名的端点,tdn是目标数据库名称,如果您有特殊字符或puncutation字符,我输入引号的密码.