14

SQL2012用のVisualStudioデータベースプロジェクトを作成し、それを既存のデータベースと同期する場合(Compare Schemaを使用)、SQLサーバーのログインも同期します。Visual Studioは、ログイン用に次のスクリプトを生成します。

CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass'

このログインが存在するサーバーで生成されたSQLを公開しようとすると、sqlcmdにエラーが表示されます。

The server principal my_user already exists.

Visual Studioによって生成されたSQLスクリプトを見ると、多くのオブジェクトがIF EXISTSステートメントでラップされていることがわかりますが、CREATELOGINはラップされていません。

プロジェクトのSQLスクリプトで手動でラップしようとしましたが、プロジェクトがビルドされず、IFを指すエラーが発生します。

SQL70001: This statement is not recognized in this context.

では、Visual StudioにIFEXISTSチェックを使用してログイン作成スクリプトを生成させ、同期機能を失わないようにするにはどうすればよいですか?

4

5 に答える 5

22

スクリプトファイル(* .sql)のBuildActionプロパティをNoneに変更します。これで問題は解決します。

ビルドアクションプロパティにアクセスするには、ソリューションエクスプローラーでSQLファイルを右クリックし、[プロパティ]をクリックします。または、ソリューションエクスプローラーでファイルを強調表示し、[F4]を押します。

于 2013-04-08T18:45:17.253 に答える
5

完全な答えを探している他の人のために、これが私がしたことです:

  1. Visual Studioで、ログインスクリプト、または私の場合はリンクサーバースクリプトを右クリックします。
  2. [プロパティ]をクリックします。
  3. [詳細設定]->[ビルドアクション]で、[ビルド]から[なし]に変更します。
  4. PreDeploymentスクリプトに、このスクリプトを実行する行を追加します私の場合、リンクサーバースクリプトをPreDeploymentスクリプトと同じフォルダーに移動しました。その後、私はただすることができます

    :r .\linkedserver.sql

  5. decpacをデプロイすると、ログインスクリプトまたはリンクサーバースクリプトが正常に実行されます。
于 2017-02-07T22:09:01.640 に答える
1

質問を正しく理解しているかどうかはわかりませんが、同様のシナリオのためにここに来ました。「if」と「trycatch」で数時間を無駄にした後、ここに私の答えがあります:

DacPacを見て、エクスポートまたはインポート時にユーザーとログインを除外する場合、ログインを除外するオプションがあるはずです。データベースプロジェクトの公開設定を変更できることがわかりましたが、これらの設定は* .userファイルに保存されており、通常はソース管理に入れません。さらに調べてみると、sqlpackage.exeのコマンドラインオプションが見つかりました https://blogs.msdn.microsoft.com/ssdt/2015/02/23/new-advanced-publish-options-to-specify-object-types-to-除外またはドロップしない/。NuGetからsqlpackage.exeを取得できることを考えると、これは非常にうまく機能しているようです(https://blogs.msdn.microsoft.com/ssdt/2016/08/22/releasing-ssdt-with-visual-studio-を参照)。 15-preview-4-and-introducing-ssdt-msbuild-nuget-package /)。したがって、CIマシン上に構築し、その結果をサーバーにデプロイする方法には何もありません。

編集:これは、それぞれのSSDTを使用したVS2015にあります。

于 2016-12-21T09:03:41.433 に答える
0

私はまったく同じ問題を抱えており、私からの解決策は、展開前のスクリプトでユーザーを削除することでした。

IF EXISTS(SELECT TOP 1 1 FROM master.sys.server_principals WHERE name = 'my_user') BEGIN
   DROP LOGIN [my_user]
END

問題は、作成後にパスワード、権限、または設定を変更した可能性がありLOGIN [my_user]、ドロップして作成した後、カスタマイズされた設定が失われることです。

于 2013-04-05T08:31:28.657 に答える
-1
IF NOT EXISTS
(
SELECT [Column Name Where Username Is Stored] 
FROM [Table Name That Holds The Login's] 
WHERE name = 'my_user'
)
BEGIN 
CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass'

ELSE....

次に、elseステートメントを記述してそれを処理できますが、パスワードを新しいパスワードに更新する場合でも、ユーザーが既に存在することを示すメッセージを返す場合でも、必要に応じて処理できます。その部分を書くのに助けが必要な場合は私に知らせてください。

于 2012-06-04T22:04:19.047 に答える