ラベル SQL Server の投稿を表示しています。 すべての投稿を表示
ラベル SQL Server の投稿を表示しています。 すべての投稿を表示

2017年7月21日金曜日

【SQL Server】【Visual Studio】【C#】DBからC#コード更新(上書き)

◆メニュー
 【SQL Server】開発環境構築(ER図作成にSSMSを使用)

◆手順

1.edmxファイルをダブルクリック。

2.モデルブラウザの空白部分を右クリックし、[データベースからモデルを更新]

3.「完了」ボタンを押下。

4. 変更されたことを確認(下図では生年月日が増えた)し、Ctrl+Sで保存。

5.以下が表示された場合は、「すべてに適用」ボタン押下。

6.生成されたコードも生年月日が増えている。

2017年7月15日土曜日

【SQL Server】【Visaul Studio】DBからC#コード生成

◆メニュー
【SQL Server】開発環境構築(ER図作成にSSMSを使用)

◆概要
SSMSで作成したDBインスタンスからC#のエンティティクラスを生成する手順

◆環境
Visual Studio Pro以上(Community版は未調査。)

1. Winキー押下し、visを入力し、Enterキー押下。(環境によってはVisだけでは足りないので、入力文字を増やすこと)

2. [ファイル]-[新規作成]-[プロジェクト]を選択。

3. 適切なテンプレートを選択し、適切なプロジェクト名を設定し、OKボタン押下。

4. Ctrl+Shift+Bでビルドし、F5キーで実行まで確認しておく。

5. プロジェクトを右クリックし、[追加]-[新しい項目]を選択。

6. 「ADO.NET Entity Data Model」を選択、適切な名前を入力し、「追加」ボタン押下。

7. 「データベースからEF Designer」を選択し、「次へ」ボタン押下。

8. サーバ名・データベース名を入力し、「テスト接続」ボタン押下。サーバ名・DBインスタンス名は読み替えること。

9. 「OK」ボタン押下。

10. 「接続設定に名前を付けて App.Config」に保存をチェックし、「次へ」ボタン押下。

11. 「Entity Framework 6.x」を選択し、「次へ」ボタン押下。

12. データベースオブジェクトは全選択し、「完了」ボタン押下。下記ではビューが存在しないため、チェックしていないが、基本的には全てにチェックを入れる。(モデル名前空間はDbEmployeesModelのようにしたほうがいいかも。)

13. 「OK」ボタン押下。

14. ソリューションエクスプローラーにedmxが作成され、配下にテーブル名.csが生成ていることを確認。

15. MainWindows.xamlをダブルクリックし、ツールボックスからButtonをD&D。

16. フォーム上に配置したbuttonを選択し、プロパティパネルの⚡ボタンを押下し、Clickテキストボックスをダブルクリック。
17. コードが生成されることを確認。

18. 下記のようにDBアクセスのコードを入力し、ビルド&実行。


namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            using (var ctx = new DB_EMPLOYEESEntities())
            {
                using (var tran = ctx.Database.BeginTransaction())
                {
                    ctx.T_部署.Add(new T_部署() { 部署ID = 1, 部署名 = "開発1" });
                    ctx.T_社員.Add(new T_社員() { 社員ID = 1, 姓 = "名無し", 名 = "太郎", 所属部署ID = 1 });

                    ctx.SaveChanges();
                    tran.Commit();
                }

                var ret = (from shain in ctx.T_社員
                           join bu in ctx.T_部署
                             on shain.所属部署ID equals bu.部署ID
                         select new { shain, bu }).First();

                // Namespace==Systemは、外部参照などを表示しないようにプリミティブとstringのみにフィルタ
                // しっくりこないが…。
                Func<object, List<string>> trans = o =>
                    (  from ps in o.GetType().GetProperties()
                      where ps.PropertyType.Namespace == "System"
                     select ps.Name + ":" + ps.GetValue(o, null)).ToList();

                MessageBox.Show(
                    string.Join(",", trans(ret.bu   )) + Environment.NewLine +
                    string.Join(",", trans(ret.shain)));
            }
        }
    }
}

19. Buttonを押下。

20. selectの結果も正しい。


21. SSMSで確認しても、レコードが挿入されていることが確認できる。


【SQL Server】開発用DBインスタンス作成&インポート

◆メニュー
 【SQL Server】開発環境構築(ER図作成にSSMSを使用)

◆前書き
 DB設計とアプリ開発を平行作業するなら、ER図作成用とアプリ開発用のDBインスタンスは分けておくと良い。管理が面倒だが、テーブル設計中にアプリの変更が発生なんて時に便利。(むぅ、アプリ開発者とDB設計者って普通のプロジェクトでは別々の人がやるんじゃねーの?)
 開発の終盤ではだんだん面倒になってきて、メンテナンスしなくなる。終盤では一本に絞っていいかも。
 DBインスタンスではなく、インスタンス内のDBを複数作る手もあるが、DB名はそこら中に出てくるため※、DBを複数作り、DB名を変えるというのも結構面倒になる。
 【SQL Server】新規インスタンス作成(ER図作成用)を参照してDBインスタンスを作成する。ただし、インスタンス名はDevelopにしておく。(大文字だけは見ずらい。Developのほうが見やすい。いや、長いのでDevで良い。)

※ 下記のように、DDLのエクスポートファイル等にDB名である「DB_EMPLOYEES」が出てきてしまっている。

◆インポート手順
1. インポート先のDBインスタンスへ接続

2. エクスポートしたファイル(script.sql)をSSMSへD&D。

3. インスタンス名を変更。下記ではERDIAGRAMをDevelopに変更している。ファイル内に2か所存在している。


4. 「!実行(X)」ボタンを押下。「コマンドは正常に完了しました。」となることを確認。


2017年7月14日金曜日

【SQL Server】DDL文をエクスポート Management Studio

◆メニュー
 【SQL Server】開発環境構築(ER図作成にSSMSを使用)

◆DDL文をエクスポート(SQL Server Management Studio)手順

1. Winボタン押下&「SSMS」と入力し、Enter。

2. 認証方法を選択し、接続。

3. 「スクリプトの生成」を選択。

4.  「次へ」ボタン押下

5. 必要なものを選択。以下では「データベース全体~」を選択。

6. オプションを選択して、次へ。(詳細設定ボタンで、より細かくオプションを選べる)

※ここで悩ましい問題がある。
 単一ファイルの場合、DDLが巨大(数千行?)だと、エクスポートは成功しても、インポートに失敗することがある(SQL Server2008の頃なので、今は大丈夫かも)。逆に「オブジェクトごとに1つのファイル」としてしまうと、インポートの際に、外部キー制約を意識して順番にファイルを投入する必要がある。

 両方出しておけばいいか。svnで扱う際はファイル単位のほうが過去ファイルと比較しやすいし、初回登録は、単一ファイルのほうが楽だし。巨大すぎて失敗したら、その時にファイル分割するかな。


7. 内容を確認し、「次へ」ボタン押下

8.「完了」ボタン押下。

9. ファイル出力を確認

10. ファイル内容を確認

以上

2017年5月28日日曜日

【SQL Server】ミラーリング構築

◆メニュー
 【SQL Server】開発環境構築(ER図作成にSSMSを使用)

■SQL Server2012(試用版)でミラーリングを構築
●注意事項
  • 今回は監視サーバは使用しないが、手順はさほど変わらない。
  • 以下の手順ではANONYMOUSなるユーザに権限を与えているので注意!!誰でもミラーリングのポートにアクセスできるのかな?要調査&変更。
  • またミラーリングより後に、AlwaysOnが追加されて、置き換えられつつある。
●事前準備
1. Server1(以下ではwin10x64svr1)にOSインストール
2. Server1にSQLServer2012をインストール
3. Server1にwk(適宜変更すること)というデータベースを作成
4. Server2にOSインストール
5. Server2にSQLServer2012をインストール
6. Server2にwk(適宜変更すること)というデータベースを作成(Server2側のデータベースは作っておかなくても大丈夫かも)

●手順
◆以下Server1の作業
1. Server1で復旧モデルを「完全」にする
1.1. ssmsを起動し、ログイン
1.2. wkを右クリックし、プロパティを選択
1.3 復旧モデルを「完全」にして、OKボタン押下
2.  Server1で完全バックアップ取得
2.1. wkを右クリックし、タスク-バックアップを選択(データベースがある程度大きい場合は圧縮オプションをつけると容量が小さくなるかも、容量が小さくなれば、後でServer2へコピーする際の時間も早くなるはず)
2.2. 削除ボタン&追加ボタンを押下
2.3. バックアップ先をc:\bk\wk.bak(適宜読み替え)に変更し、OKボタン押下
2.4. OKボタン押下

3. Server1でトランザクションバックアップ取得
3.1. wkを右クリックし、タスク-バックアップを選択
3.2. 削除ボタン&追加ボタンを押下(データベースがある程度大きい場合は圧縮オプションをつけると容量が小さくなるかも、容量が小さくなれば、後でServer2へコピーする際の時間も早くなるはず)
3.3. バックアップ先をc:\bk\wk.trn(適宜読み替え)に変更し、OKボタン押下
3.4. OKボタン押下

4. ファイル共有またはリモートデスクトップで、wk.bak、wk.trnをServer2へコピー。

◆以下Server2の作業
5. バックアップの復元
5.1. wkを右クリックし、タスク- 復元-データベースを選択(wkデータベースは事前に作成しなくても復元できるかも)
5.2. デバイスを選択し、...ボタンを押下
5.3. 追加ボタン押下
5.4. Server1からServer2へコピーしたwk.bakを指定
5.5. OKボタン押下
5.6. オプションタブを選択
5.7. 以下のように設定し、OKボタン押下
「既存のデータベースを上書きする」をチェック
「RESTORE WITH NORECOVERY」を選択 ★★これは必須★★
「復元の前にログ末尾のバックアップを実行する」を解除
 他に接続があった場合は、以下のように失敗するので、「接続先データベースへの既存の接続を閉じる」を選択 しOKボタン押下
 5.8. OKボタン押下
6. トランザクションログ復元
6.1. wkを右クリックし、タスク-復元-トランザクションログを選択
6.2. 「ファイルまたはテープから」 を選択し、...ボタン押下
6.3. 追加ボタン押下
 6.4. Server1からServer2へコピーしたwk.trnを指定し、OKボタン押下
6.5. OKボタン押下
6.6. オプションタブ選択し、真ん中(RESTORE WITH NORECOVERY )を選択し、OKボタン押下 ★★これは必須★★
6.7. OKボタン押下

◆以下Server1・Server2の操作
7. ファイアウォールのポートを解除
7.1. Server1でWinキー押下し、fireを入力し、「セキュリティが強化されたWindowsファイアウォール」を選択

7.2. 詳細設定を選択
7.3. ポートを選択し、次へを押下
7.4. TCP、特定のローカルポートを選択し、「1433, 5022, 7022」を入力し、次へを押下(7022は不要かも)

7.5. 接続を許可するを選択し、次へを押下
7.6. 次へ押下
7.7. SQLServerMirror(適宜名前を変更する)を入力し、完了を押下
7.8. Server2に対して、7.1.~7.7.を実施。

◆以下Server1の操作
8.  ミラーリング構築
8.1. Server1でwkを右クリックし、タスク-ミラーを選択
8.2. セキュリティの構成ボタンを押下
8.3. 次へを押下
8.4. 今回は監視サーバによるフェールオーバーを使わないので、「いいえ」を押下。
8.5.  次へを押下
8.6. 接続ボタンを押下
8.7. Server2のホスト名を指定し、接続ボタンを押下(ここで失敗する場合、ファイアウォールやホスト名、ネットワーク関連で設定不備があると思われる、自分の場合ファイアウォールのポート番号で5022だけ開けておけば良いと思ってたが、1433も必要だった。)
8.8. 次へボタンを押下
8.9. 次へボタンを押下
8.10. 完了ボタンを押下
8.11. 閉じるボタンを押下
8.12. ミラーリングの開始ボタンを押下
8.13. はいボタンを押下
⇒以下のように同期完了が出れば成功
8.14.1. 本来なら上記のダイアログが表示されるはずだが、以下は失敗。
8.14.2. 失敗した場合はログを見てgoogle検索。自分の場合は権限だった。ログは、管理-SQL Server ログ-現在をダブルクリック。念のため、Server1、2両方見ること。
8.14.3. 下記のようなログが出力されていた。
エラーログ(テキスト)

日付 2017/05/28 17:07:02
ログ SQL Server (現在 - 2017/05/28 17:18:00)

ソース Logon

メッセージ
Database Mirroring login attempt by user 'NT AUTHORITY\ANONYMOUS LOGON.' failed with error: 'Connection handshake failed. The login 'NT AUTHORITY\ANONYMOUS LOGON' does not have CONNECT permission on the endpoint. State 84.'.  [CLIENT: 2408:211:1427:2000:1904:d5f9:1ad1:1e30]

エラーがない場合は、以下の手順は不要。
◆以下Server1、Server2の操作
9. ANONYMOUSE LOGONに権限付与(本来は危険と思われる)
9.1. セキュリティ-ログインを右クリックし、新しいログインを選択
9.2. 検索ボタン押下
9.3. 詳細設定ボタン押下
9.4. 検索ボタン押下
9.5. ANONYMOUSE LOGONを選択し、OKボタンを押下
9.6. OKボタンを押下
9.7. サーバーロールタブを選択し、sysadminを選択し、OKボタンを押下。(この手順は不要?)
9.8. データベース-システムデータベース-masterを選択し、新しいクエリを押下
9.9. 以下を入力し、実行ボタンを押下。
GRANT CONNECT ON ENDPOINT::ミラー化 TO [NT AUTHORITY\ANONYMOUS LOGON];

手順9.1~9.8実施後に、再度、ミラーリング構築(手順8.1.~8.13)を実施したら同期に成功

OSSよりかは随分楽だが、それでも手順は長く、複雑だ…。
つーかMicrosoftの言うフェールオーバーって意味合ってんのか?手動でもフェールオーバーって言ってるけど手動で系切り替えするのって、スイッチオーバだと思ってたゾ。