Symfoware

Symfowareについての考察blog

UbuntuにインストールしたSQL Serverでデータベース、テーブルを作成(sqlcmd)

Ubuntu Server 16.04にSQL Serverをインストールしました。
Ubuntu Server 16.04 固定IPへの変更とSSH接続の有効化

sqlcmdを使用して、データベースとテーブルの作成を行ってみます。


sqlcmd



そういえば、sqlcmdでデータベースの作成を試したことがありました。
SQL Server 2008 R2 Express コマンドでデータベースとテーブルを作成する(sqlcmd)


sampleデータベース、postalテーブルを作成してみます。


・create.sql


USE master;
GO

CREATE DATABASE sample;
GO

USE sample;
GO

CREATE TABLE postal (
    code char(7) not null,
    address nchar(100) not null
);
GO




create.sqlというファイル名で保存しました。
sqlcmdでファイルに記載している内容を実行。


$ sqlcmd -U sa -P P@ssw0rd -i create.sql
Changed database context to 'master'.
Changed database context to 'sample'.




実行できたようです。


データの登録や検索を試してみます。
sqlcmdでデータベースに接続


$ sqlcmd -U sa -P P@ssw0rd




sampleデータベースに切り替え。


1> use sample;
2> go
Changed database context to 'sample'.




データ登録。


1> insert into postal (code,address) values ('1234567', 'テスト住所');
2> go

(1 rows affected)




登録したデータを検索。


1> select * from postal;
2> go
code    address                                                                                            
------- ----------------------------------------------------------------------------------------------------
1234567 テスト住所                                                                                            

(1 rows affected)




ちゃんと動いてくれています。
exitでsqlcmdを終了します。


1> exit
$




Management Studio上からも確認できました。

749_01.png


テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/04/26(水) 00:21:43|
  2. SQL Server
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

SQL Server 2017 照合順序のデフォルト値確認と変更

Ubuntu Server 16.04にSQL Serverをインストールしました。
Ubuntu Server 16.04 固定IPへの変更とSSH接続の有効化


そういえば、インストール時に照合順序の指定がなかったなと思ったので、
確認と変更を行ってみます。




現在の照合順序



現在の照合順序を確認するには、


  1. SELECT CONVERT (varchar, SERVERPROPERTY('collation'))



を実行すればよいようです。
照合順序情報の表示


sqlcmdを使用し、Ubuntu上で実行してみます。


$ sqlcmd -U sa -P P@ssw0rd -Q "SELECT CONVERT (varchar, SERVERPROPERTY('collation'))"
                            
------------------------------
SQL_Latin1_General_CP1_CI_AS

(1 rows affected)




現在の照合順序は「SQL_Latin1_General_CP1_CI_AS」ですね。





照合順序の変更



こちらを参考に、照合順序を「Japanese_CI_AS」へ変更してみます。
Configure SQL Server on Linux with the mssql-conf tool

「Change the SQL Server collation」の項目を参考に、コマンドを実行。


$ sudo /opt/mssql/bin/mssql-conf set-collation
Enter the collation: Japanese_CI_AS
This is an evaluation version. There are [173] days left in the evaluation period.
sqlservr: Another instance of the application is already running.



エラーで終了しました。


どうも、データベースを停止していないと変更できない模様。
一旦、mssql-serverをstopした後、コマンドを実行してみます。


$ sudo service mssql-server stop
$ sudo /opt/mssql/bin/mssql-conf set-collation
Enter the collation: Japanese_CI_AS

This is an evaluation version. There are [173] days left in the evaluation period.
2017-04-25 23:50:22.47 Server     Microsoft SQL Server vNext (CTP2.0) - 14.0.500.272 (X64)

(略)

Trace ID = '1'. This is an informational message only; no user action is required.
成功しました。SQL Server を起動するには 'sudo systemctl start mssql-server' を実行してください




データベースを起動。
再度照合順序を確認してみます。


$ sudo service mssql-server start
$ sqlcmd -U sa -P P@ssw0rd -Q "SELECT CONVERT (varchar, SERVERPROPERTY('collation'))"
                            
------------------------------
Japanese_CI_AS                

(1 rows affected)




変更できました。

Management Studioからも変更が確認できます。

748_01.png


テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/04/25(火) 23:58:25|
  2. SQL Server
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

SQL Server 2017 vNext(14.0)をUbuntu Server 16.04にインストール

SQL ServerがLinuxにインストールできるようになりました。
Ubuntu Server 16.04にインストールしてみようと思います。

SQL Server on Linux Documentation



インストール



こちらを参考にしました。
Install SQL Server on Ubuntu

※注意:搭載しているメモリは4GBないと、インストール時にエラーとなります。


apt-keyを更新。


$ curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -




実行すると、sudoの入力待ちになりますので、ログインユーザーのパスワードを入力します。


$ curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
[sudo] symfo のパスワード: % Total    % Received % Xferd Average Speed Time    Time     Time Current
                                 Dload Upload Total Spent    Left Speed
100 983 100 983    0     0 1734     0 --:--:-- --:--:-- --:--:-- 1733
[ここで固まったように見えるがパスワードまち。パスワードを入力してエンター]
OK





aptのソースリストを追加。


$ curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server.list | sudo tee /etc/apt/sources.list.d/mssql-server.list




実行の様子


$ curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server.list | sudo tee /etc/apt/sources.list.d/mssql-server.list
% Total    % Received % Xferd Average Speed Time    Time     Time Current
                                 Dload Upload Total Spent    Left Speed
100    87 100    87    0     0     29     0 0:00:03 0:00:02 0:00:01    29
deb [arch=amd64] https://packages.microsoft.com/ubuntu/16.04/mssql-server xenial main




aptの内容を更新して、インストールを実行します。

その前に、apt-transport-httpsをインストールしておきます。
インストールしていないと、こんなエラーが発生します。


E: メソッドドライバ /usr/lib/apt/methods/https が見つかりません。
N: パッケージ apt-transport-https はインストールされていますか?




update,installを実行します。


$ sudo apt-get install apt-transport-https
$ sudo apt-get update
$ sudo apt-get install -y mssql-server




最初、仮想環境に2GBのメモリを割り当ててインストールを試していたのですが、
こんなエラーで終了しました。


ERROR: This machine must have at least 3.25 gigabytes of memory to install Microsoft(R) SQL Server(R).
mssql-server は終了コード 1 で前設定に失敗しました




メモリの割当を4GBに変更し、再度インストールを実行。


$ sudo apt-get install -y mssql-server

...

mssql-server (14.0.500.272-2) を設定しています ...

+--------------------------------------------------------------+
'sudo /opt/mssql/bin/mssql-conf setup' を実行し、
Microsoft SQL Server のセットアップを完了してください
+--------------------------------------------------------------+





今度は正常終了してくれました。







初期セットアップ



インストールが完了したら、指定通り初期セットアップのコマンドを実行します。


$ sudo /opt/mssql/bin/mssql-conf setup




ライセンス認証やパスワードの入力などを求められます。


$ sudo /opt/mssql/bin/mssql-conf setup

この製品のライセンス条項は、次の URL からダウンロードし
http://go.microsoft.com/fwlink/?LinkId=746388
ファイル /usr/share/doc/mssql-server/LICENSE.TXT で参照できます。

ライセンス条項に同意しますか? [Yes/No]:Yes
Microsoft SQL Server を設定しています
新しい SQL Server システム管理者パスワードを入力してください: [任意のパスワード入力]
新しい SQL Server システム管理者パスワードを確認入力してください: [上記と同じパスワード入力]
Microsoft SQL Server を開始しています...
起動時の Microsoft SQL Server の実行を有効にしています...
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to
/lib/systemd/system/mssql-server.service.
セットアップが正常に完了しました。




ここで入力したパスワードがSQL Serverのsa(管理者権限ユーザー)のパスワードになります。
systemctlを実行すると、サービスが開始されているか確認できます。


$ systemctl status mssql-server
● mssql-server.service - Microsoft SQL Server Database Engine
Loaded: loaded (/lib/systemd/system/mssql-server.service; enabled; vendor pre
Active: active (running) since 火 2017-04-25 22:58:37 JST; 1min 26s ago
     Docs: https://docs.microsoft.com/en-us/sql/linux
Main PID: 1366 (sqlservr)
CGroup: /system.slice/mssql-server.service
         ├─1366 /opt/mssql/bin/sqlservr
         └─1384 /opt/mssql/bin/sqlservr

4月 25 22:58:41 mssql sqlservr[1366]: [82B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [84B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [122B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [145B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [66B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [75B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [96B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [100B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [71B blob data]
4月 25 22:58:41 mssql sqlservr[1366]: [124B blob data]








sqlcmdのインストール



続いて、sqlcmd等のツールのインストールを行いました。
Install sqlcmd and bcp the SQL Server command-line tools on Linux


apt-keiの追加
(SQL Serverのインストールを行っている場合は不要)


$ curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -




aptのソースリストを追加


$ curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list




update,installを実行します。


$ sudo apt-get update
$ sudo apt-get install mssql-tools unixodbc-dev




インストール中、ライセンス認証の画面が表示されます。
「はい」を選択してエンターキーを押下します。

747_01.png

747_02.png



ツールは「/opt/mssql-tools/bin」にインストールされます。


$ ls /opt/mssql-tools/bin
bcp sqlcmd




パスを通しておくと便利です。


$ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
$ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
$ source ~/.bashrc




sqlcmdのヘルプを表示してみます。


$ sqlcmd -?
Microsoft (R) SQL Server Command Line Tool
Version 13.1.0006.0 Linux
Copyright (c) 2012 Microsoft. All rights reserved.

usage: sqlcmd            [-U login id]         [-P password]
[-S server or Dsn if -D is provided]
[-H hostname]         [-E trusted connection]
[-N Encrypt Connection][-C Trust Server Certificate]
[-d use database name] [-l login timeout]     [-t query timeout]
[-h headers]         [-s colseparator]     [-w screen width]
[-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
[-c cmdend]
[-q "cmdline query"] [-Q "cmdline query" and exit]
[-m errorlevel]        [-V severitylevel]     [-W remove trailing spaces]
[-u unicode output]    [-r[0|1] msgs to stderr]
[-i inputfile]         [-o outputfile]
[-k[1|2] remove[replace] control characters]
[-y variable length type display width]
[-Y fixed length type display width]
[-p[1] print statistics[colon format]]
[-R use client regional setting]
[-K application intent]
[-M multisubnet failover]
[-b On error batch abort]
[-D Dsn flag, indicate -S is Dsn]
[-X[1] disable commands, startup script, environment variables [and exit]]
[-x disable variable substitution]
[-? show syntax summary]



ちゃんとインストールできたようです。





別サーバーからの接続



WindowsにインストールしたSQL Server Management Studio (SSMS) から接続してみます。

認証:SQL Server認証
ログイン:sa
パスワード:インストール時に入力したパスワード

747_03.png


普通に接続できました。

747_04.png


データの保存パスを見てみると、「/var/opt/mssql/data」になっています。
ちゃんとLinuxのSQL Serverに接続できたようです。

747_05.png



テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/04/25(火) 23:28:14|
  2. SQL Server
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Windows Server 2016 ASP.NET aspxページでSQL Server 2016に接続する

Windows Server 2016にIIS 10.0をインストール。
ASP.NETが動作する環境を構築しました。

Windows Server 2016 にIIS 10.0をインストールし、ASP.NETを有効化


せっかくなので、aspxでSQL Server 2016に接続して、データを取得するプログラムを作成してみます。


使用する環境



接続するSQL Server 2016はこちらで使用したものです。
Windows Server 2016のポートを開放する(SQL Server 2016 外部接続許可)
Debian 8(jessie) + C#(Mono)でSQL Server 2016に接続する

aspxのソースは、以前MySQLに接続した時のものを参考にしました。
ASP.NET aspxページでMySQLに接続する




サンプルプログラム



「C:\inetpub\wwwroot」に「sample.aspx」というファイルを作成します。
ファイルの内容は以下のとおり。


  1. <%@ Page Language="C#" %>
  2. <%@ Import Namespace="System.Data" %>
  3. <%@ Import Namespace="System.Data.SqlClient" %>
  4. <script runat="server">
  5. protected void Page_Load(Object source, EventArgs e) {
  6.     if (IsPostBack) {
  7.         return;
  8.     }
  9.     
  10.     // 接続文字列を作成
  11.     string connectString = "Data Source=192.168.1.104;";
  12.     connectString += "Initial Catalog=sample;";
  13.     connectString += "User ID=sa;";
  14.     connectString += "Password=P@ssw0rd;";
  15.     connectString += "Trusted_Connection=False;";
  16.     
  17.     
  18.     // 取得したデータ退避用
  19.     DataTable dt = new DataTable();
  20.     
  21.     using (SqlConnection con = new SqlConnection(connectString))
  22.     using (SqlDataAdapter adapter = new SqlDataAdapter()) {
  23.         con.Open();
  24.         
  25.         // クエリを実行して、結果をDataTableに退避
  26.         string query = "SELECT * FROM t1";
  27.         adapter.SelectCommand = new SqlCommand(query, con);
  28.         adapter.Fill(dt);
  29.         
  30.     }
  31.     
  32.     // 画面上のDataGridとバインド
  33.     datagrid.DataSource = new DataView(dt);
  34.     DataBind();
  35. }
  36. </script>
  37. <html>
  38. <body>
  39. <asp:DataGrid id="datagrid" runat="server" />
  40. </body>
  41. </html>




ブラウザでhttp://[サーバーIP]/sample.aspxを表示してみると、
テーブルに登録している内容が表示されました。

715_01.png


お手軽でいいですね。

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/10/06(木) 01:06:58|
  2. SQL Server
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Debian 8(jessie) + C#(Mono)でSQL Server 2016に接続する

Debian 6 + Monoでも同様のことをやったことがあるのですが、改めて試してみます。
Debian(Squeeze) + MonoでSQL Serverに接続する


Monoのインストールはこちら。
Debian 8(jessie)にapt-getでmonoをインストール

SQL Server 2016は外部から接続可能なように構成しておきます。
Windows Server 2016のポートを開放する(SQL Server 2016 外部接続許可)




DebianとMonoのバージョン



実行時のDebianやMonoのバージョンです。


# cat /etc/debian_version
8.6

# uname -a
Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux

# mono -V
Mono JIT compiler version 4.6.1 (Stable 4.6.1.3/abb06f1 Wed Sep 28 13:54:26 UTC 2016)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:         __thread
    SIGSEGV:     altstack
    Notifications: epoll
    Architecture: amd64
    Disabled:     none
    Misc:         softdebug
    LLVM:         supported, not enabled.
    GC:            sgen




Debian 8.6、Mono 4.6.1の環境です。





テストデータベース



IP : 192.168.1.104
User ID : sa
Password : P@ssw0rd

sampleというデータベースにt1というテーブルを作成しました。
idがint型、valueがvarchar型です。

713_01.png




データの登録



簡単なデータの登録プログラムはこんな感じになります。


  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         // 接続文字列
  9.         string connectString = "Data Source=192.168.1.104;";
  10.         connectString += "Initial Catalog=sample;";
  11.         connectString += "User ID=sa;";
  12.         connectString += "Password=P@ssw0rd;";
  13.         connectString += "Trusted_Connection=False;";
  14.         
  15.         // データベースに接続
  16.         using (SqlConnection con = new SqlConnection(connectString)) {
  17.             
  18.             // 登録実行
  19.             string query = "INSERT INTO t1 (id, value) VALUES (1, 'C#から登録テスト')";
  20.             
  21.             con.Open();
  22.             SqlCommand cmd = new SqlCommand(query, con);
  23.             cmd.ExecuteNonQuery();
  24.             
  25.         }
  26.         
  27.     }
  28. }




コンパイル時、「-r:System.Data.dll」を付与してSystem.Data名前空間が使用できるようにします。


# mcs sample.cs -r:System.Data.dll




付けていないと、こんなエラーが発生します。


sample.cs(2,14): error CS0234: The type or namespace name `Data' does not exist in the namespace `System'.
Are you missing `System.Data' assembly reference?




プログラムを実行すると、ちゃんとデータが登録されていました。

713_02.png





SqlDataAdapterを使用したデータの検索



今度は登録したデータを検索してみます。


  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         // 接続文字列
  9.         string connectString = "Data Source=192.168.1.104;";
  10.         connectString += "Initial Catalog=sample;";
  11.         connectString += "User ID=sa;";
  12.         connectString += "Password=P@ssw0rd;";
  13.         connectString += "Trusted_Connection=False;";
  14.         
  15.         // データベースに接続
  16.         using (SqlConnection con = new SqlConnection(connectString)) {
  17.             
  18.             using (SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM t1", con))
  19.             using (DataTable dt = new DataTable()) {
  20.                 
  21.                 // 検索結果をDataTableに退避
  22.                 da.Fill(dt);
  23.                 
  24.                 // 内容を表示
  25.                 foreach (DataRow dr in dt.Rows) {
  26.                     Console.WriteLine("id:{0}, value:{1}", dr["id"], dr["value"]);
  27.                 }
  28.                 
  29.             }
  30.             
  31.         }
  32.         
  33.     }
  34. }




実行結果


# ./sample.exe
id:1, value:C#から登録テスト




ちゃんとデータが取得できていますね。





SqlDataAdapterを使用したデータの登録



SqlDataAdapterを使用してデータの更新が行えるのは知っていたのですが、
試したことがなかったのでやってみます。

Mono特有なのかもしれませんが、こんなエラーが発生して苦しみました。


-- 更新用のクエリーが設定されていない
Unhandled Exception:
System.InvalidOperationException: Update requires a valid UpdateCommand when passed DataRow collection with modified rows.


-- 更新用のクエリーのコネクションが初期化されていない
Unhandled Exception:
System.InvalidOperationException: Update requires the command clone to have a connection object.
The Connection property of the command clone has not been initialized.


Unhandled Exception:
System.InvalidOperationException: Update requires the UpdateCommand to have a connection object.
The Connection property of the UpdateCommand has not been initialized.





最終的に、データの追加や更新を行うプログラムはこうなりました。


  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         // 接続文字列
  9.         string connectString = "Data Source=192.168.1.104;";
  10.         connectString += "Initial Catalog=sample;";
  11.         connectString += "User ID=sa;";
  12.         connectString += "Password=P@ssw0rd;";
  13.         connectString += "Trusted_Connection=False;";
  14.         
  15.         // データベースに接続
  16.         using (SqlConnection con = new SqlConnection(connectString)) {
  17.             
  18.             using (SqlDataAdapter da = new SqlDataAdapter())
  19.             using (DataTable dt = new DataTable()) {
  20.                 
  21.                 da.SelectCommand = new SqlCommand("SELECT * FROM t1", con);
  22.                 SqlCommandBuilder builder = new SqlCommandBuilder(da);
  23.                 
  24.                 con.Open();
  25.                 
  26.                 // 検索結果をDataTableに退避
  27.                 da.Fill(dt);
  28.                 
  29.                 
  30.                 // 削除クエリー準備
  31.                 da.DeleteCommand = builder.GetDeleteCommand(true);
  32.                 da.DeleteCommand.Connection = con;
  33.                 
  34.                 // 更新クエリー準備
  35.                 da.UpdateCommand = builder.GetUpdateCommand(true);
  36.                 da.UpdateCommand.Connection = con;
  37.                 
  38.                 // 登録クエリー準備
  39.                 da.InsertCommand = builder.GetInsertCommand(true);
  40.                 da.InsertCommand.Connection = con;
  41.                 
  42.                 
  43.                 // 1行目のデータを更新
  44.                 dt.Rows[0]["value"] = "C#からデータ更新";
  45.                 
  46.                 // 新しい行の挿入
  47.                 DataRow dr = dt.NewRow();
  48.                 dr["id"] = 2;
  49.                 dr["value"] = "新しい行を追加";
  50.                 dt.Rows.Add(dr);
  51.                 
  52.                 // 行の更新と追加を実行
  53.                 da.Update(dt);
  54.             }
  55.             
  56.         }
  57.         
  58.     }
  59. }




実行してみると、ちゃんとデータの更新と追加が行われています。

713_03.png



【参考URL】

DataAdapter.Update() does not Update the Database

Update requires a valid InsertCommand when passed DataRow collection with new rows

SqlCommandBuilder クラス



テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/10/04(火) 23:05:23|
  2. SQL Server
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ