6

私たちは常に .sqlproj 拡張子を使用して VS2012 SSDT でデータベースの設計と開発を行い、SQLPackage と DACPAC を使用して 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];

このタイプのデータベース プロジェクトを Amazon に公開する方法をあらゆる場所で検索しましたが、スキーマ用にローカルの SQL Server データベースを維持し、Red-Gate SQL Compare を購入して変更を移行する以外に..困惑しています..

どんな提案でも大歓迎です。

4

1 に答える 1

8

簡単な答えは、sqlpackage コマンド ラインまたは sqlproj Publish 関数を使用して、他のサーバーで使用できるのと同じ方法で amazon rds sql データベースを更新できるということです。

私が遭遇した問題は、インスタンス sa ユーザー (Amazon で最初に SQL インスタンスを作成するときにセットアップした Amazon RDS SQL インスタンスのメインの sa アカウント) を宣言および構成していないことが原因のようです。

データベースでユーザーとそのロール メンバーシップを宣言していなかったため、データベースから db_owner ロールのメンバーシップが削除され、その後再作成することは不可能に見えました。

したがって、デプロイの実行を間違えて、ターゲット データベースで SQL dbo のアクセス許可を壊した場合、解決策は、Amazon RDS コンソールに移動し、SQL インスタンスを見つけて、インスタンスを変更し、新しいマスター パスワードの設定を変更することです。 (既存のものと同じでも)、下部のボックスにチェックを入れるとすぐに適用されます。(これは、Amazon サポート チームから提供された指示です。今朝、試行錯誤の過程で何度も作業を行いました..)。

セキュリティを壊さずにアップグレードを展開するための重要な部分は次のとおりです。

  1. サーバー レベルの構成を格納するために使用される Master という 2 番目のデータベース プロジェクトを定義しました。このマスター プロジェクトに、この構文を使用して 2 人のユーザーを作成しました

    CREATE LOGIN [myusername] with password = 'mypassword';

    • myinstancesa - これは、インスタンスを定義したときに作成した sa アカウントとまったく同じ名前です。
    • myappuser - これは、アプリケーション接続文字列で使用するユーザーです。これにより、アプリケーションが sa アカウントとして実行されず、データベース レベルでセキュリティを実装して、アプリケーションが特定のアプリケーションを誤って削除または更新する機能を強制または制限できます。テーブル..
  2. 私のメイン データベース プロジェクトでは、マスターへのデータベース参照を作成し、チェック ボックスをオンにして、未解決の参照に対する参照プロジェクトのエラーを抑制します。
  3. 私のメイン データベース プロジェクトでは、すべてのアプリケーション接続権限を付与するアプリケーション ロールを定義します。たとえば、この構文を使用して -myapp_role を定義します。

    CREATE ROLE [myapp_role] AUTHORIZATION [dbo]; 次に、アプリユーザーにメンバーシップをこのロールに付与します EXECUTE sp_addrolemember @rolename = N'myapp_role', @membername = N'myappuser';

  4. アクセス許可が必要なオブジェクトを作成するときはいつでも、ユーザーではなくロールにアクセス許可を付与します。これは必要ないかもしれませんが、Amazon 以外の生活では、ロールがデータベースのバックアップと一緒に転送されるため、セキュリティの復元と再構成がはるかに簡単になりました。サーバー間の復元。例えば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 に答える