gpt4 book ai didi

amazon-web-services - 如何将 SQLPROJ DACPAC 部署到 Amazon RDS

转载 作者:行者123 更新时间:2023-12-04 08:08:05 26 4
gpt4 key购买 nike

我们一直使用 .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];

我到处搜索如何将这种类型的数据库项目发布到亚马逊,而不是诉诸维护架构的本地 SQL Server 数据库和购买 Red-Gate SQL Compare 来迁移更改..我很难过..

任何建议将不胜感激。

最佳答案

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

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

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

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

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

  • 我定义了一个名为 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';
  • 无论我在哪里创建需要权限的对象,我都会将权限授予角色,而不是用户,这可能不是必需的,但在非亚马逊生活中,它使恢复和重新配置安全性变得更加容易,因为角色与数据库备份一起传输/服务器之间的恢复。例如 GRANT INSERT ON OBJECT::[mytable] TO [myapp_role]
  • 在主数据库项目中,创建用户代表实例sa用户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 是目标数据库名称,以及我用引号括起来的密码,以防您有特殊字符或标点符号。

    关于amazon-web-services - 如何将 SQLPROJ DACPAC 部署到 Amazon RDS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23802146/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com