6

我们一直使用 .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 比较来迁移更改。我很难过。

任何建议将不胜感激。

4

1 回答 1

8

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

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

因为我没有在数据库中声明用户及其角色成员身份,所以它的 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 是在 Amazon 控制台中命名的终端节点,tdn 是目标数据库名称,如果您有特殊字符或标点符号,我将密码放在引号中。

于 2014-06-06T04:40:09.827 回答