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以迁移更改..我很难过...
任何建议将不胜感激.
简单的答案是我们可以使用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';
在我的主数据库项目中 - 我定义了我想要授予我所有应用程序连接权限的应用程序角色 - 例如-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是在亚马逊控制台中命名的端点,tdn是目标数据库名称,如果您有特殊字符或puncutation字符,我输入引号的密码.
| 归档时间: |
|
| 查看次数: |
2863 次 |
| 最近记录: |