none
ストアド移行 RRS feed

  • 質問

  • ご教授お願い致します。

      ユーザーへ一括ではなく段階的にシステムを納品していますが
      納品後に、新しいストアドを作成し
      ユーザー側にあるSQLサーバーへ組み込みを行いたいのですが
      まずストアドのスプリプトをcreateで行い、
      それをクエリ保存して、ユーザーへメールで送信して
      ユーザー側で、それを実行してもらう方法を考えたのですが
      それだと組み込みは出来るのでしょうが、create文のため
      alter文に手作業で変更してもらうことになるので
      もし、別の場所を修正したり等のありえるミスが
      発生するかもしれない危険があるため、クエリの実行だけで
      組み込みが完了出来る方法はないのでしょうか?

      皆様は、どういう方法でこういう場合処理されているのですか?
      直接現地に行って処理しているのですか?

     お手数ですがご回答お願い致します。

     尚、データベースは、SQLserver2008R2です。

      以上

    2011年7月12日 3:17

回答

  • SQL Server Management Studioでデータベースに接続すると、オブジェクトエクスプローラーにストアドプロシージャが表示されます。そこを右クリックしたメニューには「ストアドプロシージャをスクリプト化」があり希望するスクリプトを生成することができます。

    そのほかの方法として、C#などの.NETプログラミングが可能ならSQL Server 管理オブジェクト (SMO)が使えます。これを使うとストアドプロシージャはStoredProcedure クラスインスタンスとして扱え、Script()メソッドを呼び出すことでSSMSと同等のことが行えます。後は、新旧データベースを比較しながら追加されたストアドプロシージャはCREATE文、変更されたものはALTER文でスクリプト生成すれば(生成するプログラムを書けば)、段階的に更新していけるでしょう。

    • 回答としてマーク 山本春海 2011年8月2日 5:49
    2011年7月13日 1:26
  • テキストファイルにsqlを書いておき、それをバッチで起動してもらうようにしてはいかがでしょうか?


    1.hoge.text 
    ----このファイルの中身--------
    alter procedure fuga.moge
    ・・・
    ・・・
    (略)
    ・・・
    ・・・
    go

    create procedure fuga.piyo
    ・・・
    ・・・
    (略)
    ・・・
    ・・・
    go

    --新規追加の場合は権限を与える必要がある場合がある。
    GRANT EXECUTE ON OBJECT::fuga.piyo TO ユーザー名
    go
    ----------------------------

    2.sql.bat
    ----このファイルの中身--------
    sqlcmd -i hoge.txt -o hoge.log -E -d データベース名 -S [サーバー名]
    ----------------------------

    ユーザーにsql.batを起動してもらう。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 山本春海 2011年8月2日 5:49
    2011年7月13日 2:08
  • ・ALTER~は怖くて使ったことありません。(いろいろ考え始めると怖くて使えないです。)


    IFで存在を調べ、存在していたら、Dropして、Createがシンプルですね。
    MSに沢山サンプルが落ちているので探されてみては。


    IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
      DROP PROCEDURE sp_hexadecimal
    GO
    CREATE PROCEDURE sp_hexadecimal

    私は、これらを、SQLCMDで実行するようなインストーラを作ることを目指します。結果的に、.batが多いですが…。

    trapemiyaさんのかかれているようにログインとか権限とかに絡みそうなので、
    そういう時にALTERって使うのでしょうか。しがらみが多いときはその選択になろうかと思います。

    ・例えば、DBを回収。丸ごと作成。DBごとリストア。
    そういう納品でも構わないかと。

    似たようなDBを隣にRESTOREしてコピーとか。ストアド部分のみのコピー。

    あとは、システム全体の空DBをクリエートするSQL文を持っている製品がほとんどだと思いますので、
    意外とこの手法の方も多いかと思います。
    (SQLサーバーのスキーマを密にアップデートする製品サイクルの製品自体が少ない)

    この場合、既存DBからデータ部をバックアップ、リストアします。
    いわゆる製品バージョンアップですね。
    新バージョンのDBにはもちろん、新ストアドプロシージャが含まれているというもの。

    ・マニュアルを先方にお渡しして実行。

    ・リモートで接続して、直接納品。
    見逃しがちだけど、一番楽。いろいろ怖いですが(^ ^;
    マニュアルの手法と、リモートの手法を組み合わせて、最近やりました。

    ・僭越ですが、会社で決まった納品手法が通常はあるものかと思います。確立された手法はないのでしょうか?
    メーカー的なところだと決まった手法があるものですので、この選択肢も念のため。

     

    ご参考までに。がんばってください!

    • 回答としてマーク 山本春海 2011年8月2日 5:49
    2011年7月14日 3:04

すべての返信

  • SQL Server Management Studioでデータベースに接続すると、オブジェクトエクスプローラーにストアドプロシージャが表示されます。そこを右クリックしたメニューには「ストアドプロシージャをスクリプト化」があり希望するスクリプトを生成することができます。

    そのほかの方法として、C#などの.NETプログラミングが可能ならSQL Server 管理オブジェクト (SMO)が使えます。これを使うとストアドプロシージャはStoredProcedure クラスインスタンスとして扱え、Script()メソッドを呼び出すことでSSMSと同等のことが行えます。後は、新旧データベースを比較しながら追加されたストアドプロシージャはCREATE文、変更されたものはALTER文でスクリプト生成すれば(生成するプログラムを書けば)、段階的に更新していけるでしょう。

    • 回答としてマーク 山本春海 2011年8月2日 5:49
    2011年7月13日 1:26
  • テキストファイルにsqlを書いておき、それをバッチで起動してもらうようにしてはいかがでしょうか?


    1.hoge.text 
    ----このファイルの中身--------
    alter procedure fuga.moge
    ・・・
    ・・・
    (略)
    ・・・
    ・・・
    go

    create procedure fuga.piyo
    ・・・
    ・・・
    (略)
    ・・・
    ・・・
    go

    --新規追加の場合は権限を与える必要がある場合がある。
    GRANT EXECUTE ON OBJECT::fuga.piyo TO ユーザー名
    go
    ----------------------------

    2.sql.bat
    ----このファイルの中身--------
    sqlcmd -i hoge.txt -o hoge.log -E -d データベース名 -S [サーバー名]
    ----------------------------

    ユーザーにsql.batを起動してもらう。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 山本春海 2011年8月2日 5:49
    2011年7月13日 2:08
  • ・ALTER~は怖くて使ったことありません。(いろいろ考え始めると怖くて使えないです。)


    IFで存在を調べ、存在していたら、Dropして、Createがシンプルですね。
    MSに沢山サンプルが落ちているので探されてみては。


    IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
      DROP PROCEDURE sp_hexadecimal
    GO
    CREATE PROCEDURE sp_hexadecimal

    私は、これらを、SQLCMDで実行するようなインストーラを作ることを目指します。結果的に、.batが多いですが…。

    trapemiyaさんのかかれているようにログインとか権限とかに絡みそうなので、
    そういう時にALTERって使うのでしょうか。しがらみが多いときはその選択になろうかと思います。

    ・例えば、DBを回収。丸ごと作成。DBごとリストア。
    そういう納品でも構わないかと。

    似たようなDBを隣にRESTOREしてコピーとか。ストアド部分のみのコピー。

    あとは、システム全体の空DBをクリエートするSQL文を持っている製品がほとんどだと思いますので、
    意外とこの手法の方も多いかと思います。
    (SQLサーバーのスキーマを密にアップデートする製品サイクルの製品自体が少ない)

    この場合、既存DBからデータ部をバックアップ、リストアします。
    いわゆる製品バージョンアップですね。
    新バージョンのDBにはもちろん、新ストアドプロシージャが含まれているというもの。

    ・マニュアルを先方にお渡しして実行。

    ・リモートで接続して、直接納品。
    見逃しがちだけど、一番楽。いろいろ怖いですが(^ ^;
    マニュアルの手法と、リモートの手法を組み合わせて、最近やりました。

    ・僭越ですが、会社で決まった納品手法が通常はあるものかと思います。確立された手法はないのでしょうか?
    メーカー的なところだと決まった手法があるものですので、この選択肢も念のため。

     

    ご参考までに。がんばってください!

    • 回答としてマーク 山本春海 2011年8月2日 5:49
    2011年7月14日 3:04