データベースの最近のブログ記事

さっき、「Oracle で DATE 項目に YYYY-MM-DD hh:mm:ss 形式で日時をセット」って話書いたけど、なんなん、Oracle、SELECT のときも、

SELECT houmon_ymdhms FROM user_list WHERE id='000011';

みたいに検索すると、結果として返ってくるのは

2019-06-11

までなんやね。

時分秒まで表示しようとすると、いちいち、

SELECT TO_CHAR(houmon_ymdhms, 'yyyy-mm-dd hh24:mi:ss')  FROM user_list WHERE id='000011';

とかせんと、

2019-06-11 12:23:34

っていう結果は返ってこん、というか、表示されんのやね。

まあ、コンソールで SQL 実行したときの話で、プログラム内ではちゃんと時分秒まで渡されてるけど。表示のときは、NLS_DATABASE_PARAMETERS.NLS_DATE_FORMAT が設定されてるとかで。

ほんま、面倒くさいんや!Oracle め!!
あんまり Oracle って触ったことがなかったので今の今まで気づかなかったんだけど、DATE 項目に例えば '2019-06-11 12:23:34' みたいな時間を登録しようとすると、

UPDATE user_list SET houmon_ymdhms=''2019-06-11 12:23:34' WHERE id='000011';

じゃ、「ORA-01830 : 日付書式の変換で不要なデータが含まれています」なんてエラーになっちゃうのね。

UPDATE user_list SET houmon_ymdhms=TO_DATE('2019-06-11 12:23:34', 'yyyy-mm-dd hh24:mi:ss') WHERE id='000011';

と、TO_DATE 関数で変換しないと駄目。
PostgreSQL なら普通に、

UPDATE user_list SET houmon_ymdhms=''2019-06-11 12:23:34' WHERE id='000011';

これで日時として登録されるけどなあ。

Oracle、ただただ面倒くさい。なんか肌が合わんわ(笑)
そろそろ「本当に Oracle じゃないと駄目?」ってことを、関係者の皆さんにも考えてみていただきたい。

最近は富士通さんなんかも業務システム開発の場面で Oracle ではなく PostgreSQL を担いで来られることも増えて、3〜4年くらい前までなら信じられない話だなあって思ってたんだけど、最近よく話題になる Oracle の馬鹿高いライセンス料の件も絡んで、確実に不沈空母 Oracle もところどころ浸水が始まってるな(笑)

いいぞ、いいぞ(笑)
テスト用データを Oracle DB にセットアップする必要があったんで、本番DBのバックアップファイルから impdb コマンドでインポートをしようかと。
全部のテーブルではなく、必要なのは3つだけなので、以下のようなコマンドを実行。

impdb HOGE/HOGEPW@HOGEDB directory=backup_dir dumpfile=backup.dmp table_exists_action=replace tables=(ロケーション,IPアドレスリスト,ユーザーマスタ)

そしたら、こんなエラーが出て失敗しちゃう。

ORA-39002: 操作が無効です
ORA-39166: オブジェクトHOGE.IPアドレスリストが見つかりません。

これ、エラーになるタイミングは毎回バラバラで、

ORA-39002: 操作が無効です
ORA-39166: オブジェクトHOGE.IPアドレスリストが見つかりません。
ORA-39166: オブジェクトHOGE.ユーザーマスタが見つかりません。

こういうときもある。
別にテーブル名が問題なわけではなく、

impdb HOGE/HOGEPW@HOGEDB directory=backup_dir dumpfile=backup.dmp table_exists_action=replace tables=(IPアドレスリスト)

こんな感じで、エラーになったテーブル単体でインポートすると、

. . "HOGE"."IPアドレスリスト"    12.3MB   12034行がインポートされました

こんな具合に成功する。カンマ区切りで複数テーブルを指定したときだけ問題。
でも、英語名のテーブルではエラーにならないんで、やっぱ日本語名なのが問題なんだろうなあと思って、

impdb HOGE/HOGEPW@HOGEDB directory=backup_dir dumpfile=backup.dmp table_exists_action=replace tables=("ロケーション","IPアドレスリスト","ユーザーマスタ")

こんな風に、テーブル名をダブルクォーテーションで括ってみた。

. . "HOGE"."ロケーション"    28.5MB   9800行がインポートされました
. . "HOGE"."IPアドレスリスト"    12.3MB   12034行がインポートされました
. . "HOGE"."ユーザーマスタ"      1.3MB   109行がインポートされました

ああ、やっぱり成功。

俺はそもそもテーブル名や項目名などに日本語を使うのが嫌い(プログラムでも、(日本語対応されているかどうかは関係なく)日本語の変数名を使うのとか大嫌い(読みづらいは!!)なんだけど、まあ、それはおいといて、日本語使えるんなら、英語名と同じ動きをしっかりしてほしいわ!!

Oracle は金に汚いだけの会社じゃのお。
Microsoft の Access で、Oracle に ODBC 接続(リンクテーブル)して表に展開。レコードの編集をしているときによく遭遇するエラー。

「バリアント型ではない変数に Null値を代入しようとしました。」

Not Null の項目に半角スペースを入れようとすると発生する。何個半角スペースを入れてもだ。
「半角スペースは Null じゃねえ!!」という正論を口にしたところで、Access なんぞをフロントエンドにしている時点で俺の負けである。

唯一の対応法を実践することになるのだが、毎回「どうすんだっけ?」と思っちゃうので、今回ばかりはここにメモしておく(笑)

つっても、色々なところで同じ質問がされているので、その URL を貼っておこうと思ったんだが、なんか、参考ページが Forbidden なエラーで見えなくなってる(^^;

なので、過去コピった内容から以下に抜粋。

    1. あらかじめクリップボードに半角スペースを1文字入れておく。(エディタに半角スペースを入力してコピーとか)
    2. 入力したいセルの左端にカーソルを持っていき、カーソルが+(白い大きな+ね)になる状態でセルをクリック。セルを選択状態にする。(入力待ち状態にしないように。やってみればわかる)
    3. Ctrl + v で貼り付け。 

これで、半角スペースが入力できる。

なんなんかね?
でも、それが Microsoft Access というものだ(笑)
Oracle のインポート走らせて、しっこに行って席に戻ったらコンソールがエラーの山。

imp user/pass@hogedb file=D:¥temp¥hoogedb.dmp log=D:¥temp¥hogedb.log ignore=y commit=y table(tbl1,tbl2,tbl3)

みたいにインポートしようとしたんだけど「一意制約エラー」が山程出てきてる(^^;

ちゃんと最初に

TRUNCATE TABLE tbl1;
TRUNCATE TABLE tbl2;
TRUNCATE TABLE tbl3;

せんと、やっぱ駄目じゃーん!ってなったってだけの話なんだけど、いや、俺、Oracle ってアプリ側から読み書きしたことくらいしかなくて、コンソールから sqlplus 立ち上げてあれこれしたのも初めてってくらいで(^^; だから最初に「インポートの前にテーブル空にしとかないと駄目ですよね?」って確認したのに、「いや、丸っと書き換わるんじゃない?」とか言われて。

単に、教えてくれた人も「Oracle よく知らなくて」ってオチでした(^^;;;
Visual Basic 2013 から SQL Server を扱うプログラムのお勉強をしようと思ってたのに、結局、Visual Studio と SQL Server のセットアップで時間を取られ、やっと今日、プログラムにとりかかることが出来たよ。

サーバ CHIBIKURO2-PC\SQLEXPRESS
DB testdb
ID dbtest
PW testpasswd

という環境で、meigen テーブルの中身を読んでグリッド・コントロールにはめ込むだけの処理。

テーブルの中身はこんな感じで。

20140628_VB2.jpg

Visual Basic のソースコードは、とりあえず試しに動かしたかったので、例外処理もまったく書いてないけど(^^;、こんな感じ。

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim strConnectSQL As String
        Dim strSQL As String
        Dim SQLDA As SqlClient.SqlDataAdapter
        Dim SQLDS As New DataSet()

        strConnectSQL = _
          "Server=CHIBIKURO2-PC\SQLEXPRESS;" & _
          "Initial Catalog=testdb;" & _
          "User ID=dbtest;" & _
          "Password=testpasswd;"

        'SQL文
        strSQL = "SELECT * FROM meigen ORDER BY sn"

        SQLDA = New SqlClient.SqlDataAdapter(strSQL, strConnectSQL)

        'データセットに格納
        SQLDA.Fill(SQLDS, "TEST")

        Me.DataGridView1.DataSource = SQLDS.Tables("TEST")

    End Sub

End Class

これで、

20140628_VB0.jpg

この画面の「データ取得」ボタン(Button1)をクリックすれば、

20140628_VB1.jpg

こんな風に testdb DB の meigen テーブルの中身がグリッド・コントロール(DataGridView1)に表示されると。

さて、これでテスト環境もしっかり出来たので、あれこれお勉強しましょう。
Visual Express Studio の SQL Server オブジェクト エクスプローラーで CHIBIKURO2-PC\SQLEXPRESS サーバに新規接続しようとしたら、エラーコード「18456」で「ユーザー 'dbtest' はログインできませんでした。」と接続を拒否された。

dbtest というのは新規に追加したユーザね。

これだけではなぜ拒否されたかわからないので、エラーログファイル
C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\Log\ERRORLOG
を確認すると、

2014-06-28 12:49:04.05 Logon       エラー: 18456、重大度: 14、状態: 58。
2014-06-28 12:49:04.05 Logon       Login failed for user 'dbtest'.理由: SQL 認証を使用したログインに失敗しました。サーバーは、Windows 認証専用に構成されています。 [クライアント: <local machine>]

というエラーが。
「サーバーは、Windows 認証専用に構成されています。」か(^^;

どうも最初にサーバを構成した時、俺は認証モードを「SQL Server 認証モードと Windows 認証モード」にしていたつもりだったが、「Windows 認証モード」になっていたようだな。

ということで、認証モードを変更する。

1.SQL Server Management Studio で、CHIBIKURO2-PC\SQLEXPRESS サーバの上で右メニューを開く。

2.一番下の「プロパティ」を選択。

3.サーバ認証を「SQL Server 認証モードと Windows 認証モード」に変更。

20140628_sql_setting1.jpg

4.「OK」を押したら「構成の変更の一部は、SQL Server を再起動するまで有効になりません。」と出てくるので更に「OK」を。

5.CHIBIKURO2-PC\SQLEXPRESS サーバの上で右メニューを開き、「再起動」を選択。

6.「CHIBIKURO2-PC の MSSQL$SQLEXPRESS サービスを再起動しますか?」と聞かれるので「はい」を押してサーバ再起動。

これで、ユーザでのログインが可能になる。

さて、プログラム書くか。
うーむ・・・(^^;
マジで、「なんだかなあ」な展開やなあ。

会社の Windows 7 Professional(64bit)で「SQL Server Data Tools の更新」に失敗したけど、翌日やり直したら上手くいった・・・という話を書いたが、「SQL Server オブジェクト エクスプローラー」の起動でも同じようなことがおきた。

Visual Studio Express 2013 の画面に、「表示」→「SQL Server オブジェクト エクスプローラー」で DB 管理用にオブジェクトエクスプローラーを表示しようと思ったんだけど・・・

20140626_vs_db_manege.jpg

なんか、エラー出ちゃったよ・・・(^^;

「'SqlStudio Profile Package'パッケージは正しく読み込まれませんでした。」・・・だって。

原因もすぐにはわからないのでオブジェクトエクスプローラーの表示は中断し、そのまま放ってたら、Visual Studio Express まで原因不明のエラーで落ちてしまった(^^;

なんなん、これ!??(^^;

結局この日は別の作業が忙しく、原因究明等は出来ず。

で、今日、Visual Studio Express を立ち上げ、原因調べようかなっと思って「SQL Server オブジェクト エクスプローラー」を開くと・・・

エラー起きんやん(^^;
DB にもちゃんと接続できたやん(^^;

なんなんもう(^^;

もしかして、あなたはエラーメッセージでググってここにたどりついた人?
もしそうなら、技術的にまったく参考にならんエントリーですまん、すまん(^^;

つまり、まあ、Windows で困ったことがおきたら、とりあえず再起動しろ・・・ってことだな(^^;
SQL Server もたまにしか使わないので、すっかり忘れてて二度手間になってもうた。

とあるサーバで動いている SQL Server の DB データを丸ごとバックアップして、他のサーバで動いている SQL Server に上書きでリストアする・・・という作業。

バックアップの種類で「完全」を選び、バックアップする DB を指定し、バックアップセットの名前とか有効期限とか設定して、バックアップ!

で、このバックアップセットを別のサーバに持って行ってリストアすると・・・

サーバ'hoge'の復元に失敗しました。(Microsoft.SqlServer.Express.Smo)
追加情報:
System.Data.SqlClient.SqlError: メディアセットには 2 メディアファミリが含まれていますが、1 だけが指定されています。すべてのメンバを指定してください。(Microsoft.SqlServer.Express.Smo)

20140325_sqlserver.JPG
ってエラー。

はいはい。
丸ごと完全バックアップのつもりだったのに、差分バックアップになってました(^^;

この時点で、古い SQL Server マシンは撤去してたのに、組み立てて再度電源オン(^^;
今度は、バックアップ時にオプションでしっかり「既存のメディアセットにバックアップする」の「既存のすべてのバックアップセットを上書きする」を指定して、無事リストア出来たのでした。

ついつい忘れちゃうので、ここにメモっとこ(^^;

あのエントリーに書いたように、他の Windows 7 Professional 機(DELL と IBM の OS プリインストール機)からは接続できているので、例えば富士通独自の設定とかプリインストールソフトとかが邪魔してるんじゃね?という可能性もあり、もう、パソコンを売った業者がどうにかする問題だと思うんだけど、何かその業者が逆ギレして大変という話だったので(^^;、「ほんじゃもう XP Mode の上で動かしたら?」・・・と提案した。

で、試しに、うちの事務所の XP Mode 環境にインストールしてみたら、エラーが出るんで焦っちゃった(^^;

SQL State: '08001'
SQL Server エラー: 53
[Microsoft][SQL Native Client]名前付きパイプのプロバイダ : SQL Server への接続を開けませんでした [53].
接続できませんでした。:

だって。

まあ、これは何となくポートが開いてないだけの問題のような気がしたので、Windows ファイアウォールを無効にしたら問題解決。
でも、まるっきり無効にしてしまうのもアレなので、SQL Server 関係のポートだけ開けておいた。

やり方は、

Windows ファイアウォール(firewall.cpl)を実行して、[詳細設定]タブで「ネットワーク接続設定」の「設定」ボタンを押して、「追加」を。
下記の2つのポートを例外で登録する。

<サービス設定1>
サービスの説明:SQL Server
IP アドレス:SQL Server の IP アドレス
外部ポート番号:1433
内部ポート番号:1433
プロトコル:TCP

<サービス設定2>
サービスの説明:SQL Server Browser Service
IP アドレス:SQL Server の IP アドレス
外部ポート番号:1434
内部ポート番号:1434
プロトコル:UDP

これだけ。

これで、XP Mode からも問題なく SQL Server へ接続できた。
XP Mode のサポートも 4月で終わるけど、ある特定の1つのアプリを動かすだけなので、これで良いんじゃないかと思うけどね。
ややこしい設定変更で Windows 7 Professional で動くようにしても、あの業者ではメンテできんだろうし。

<追記>
すみません。このエントリーに書いていることは間違っています
実際の設定方法は別の「XP Mode で SQL Server に接続する時の F/W の設定」というエントリーに書いています。
色々反省の意味も込めて、このエントリーも残していますので、ググってたどり着いた人はご注意あれ(笑)

このアーカイブについて

このページには、過去に書かれたブログ記事のうちデータベースカテゴリに属しているものが含まれています。

前のカテゴリはWindowsです。

次のカテゴリはパソコンです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら