首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将SQLPROJ部署到Amazon

如何将SQLPROJ部署到Amazon
EN

Stack Overflow用户
提问于 2014-05-22 08:57:04
回答 1查看 4.8K关注 0票数 6

我们一直使用VS2012扩展使用.sqlproj进行数据库设计和开发,并使用DACPAC使用SQLPackage部署到Server。或者从Visual设置发布规则。

我们已经将数据库迁移到Amazon Server。

我们最近对数据库设计做了一些更改,我试图发布这些更改,并得到了这个错误。

代码语言:javascript
复制
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,除了通过维护模式的本地Server数据库和购买Red比较来迁移更改之外。我很困惑..。

如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-06 04:40:09

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

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

由于我没有在数据库中声明用户及其角色成员资格,因此从数据库中删除了它的db_owner角色成员资格,在此之后似乎不可能重新创建它。

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

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

  1. 我定义了第二个名为Master的数据库项目,用于包含服务器级别的配置。在这个主项目中,我使用以下语法创建了两个用户 CREATE LOGIN [myusername] with password = 'mypassword';

代码语言:javascript
复制
- myinstancesa - this is the exact same name as the sa account you created when you defined the instance.
- myappuser - this is the user that I will use in my application connection string so that my application does not run as the sa account and I can implement security at the database level to enforce or limit the ability of the application to accidentally delete or update certain tables.. 

  1. 在我的主数据库项目中-我创建了一个对主数据库的引用,并且勾选框会将引用项目中的错误抑制为未解决的引用。
  2. 在我的主数据库项目中,我定义了我想授予我的所有应用程序连接权限的应用程序角色,例如使用这个语法的-myapp_role。 CREATE ROLE [myapp_role] AUTHORIZATION [dbo];,然后将成员资格授予我的应用程序用户给这个角色EXECUTE sp_addrolemember @rolename = N'myapp_role', @membername = N'myappuser';
  3. 无论我在何处创建需要权限的对象,我都会将权限授予角色,而不是用户,这可能不是必要的,但在非Amazon生活中,这使得恢复和重新配置安全性变得更加容易,因为该角色是在服务器之间使用数据库备份/还原传输的。eg GRANT INSERT ON OBJECT::[mytable] TO [myapp_role]
  4. 在主数据库项目中,创建表示实例sa用户CREATE USER [myinstancesa] FOR LOGIN [myinstancesa] WITH DEFAULT_SCHEMA = dbo的用户。
  5. 将db_owner角色的成员资格授予实例sa用户--这是您的用户已经拥有的安全,您需要镜像来防止它被删除。EXECUTE sp_addrolemember @rolename = N'db_owner', @membername = N'myinstancesa';
  6. 现在,您可以将其发布到目标服务器,也可以创建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是目标数据库名,我在引号中输入的密码是为了防止有特殊字符或穿孔字符。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23802146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档