SlideShare una empresa de Scribd logo
1 de 28
本当にあった怖い話し
DB 編
  プログラミング生放送勉強会 第18回@大阪
  2012/11/03 お だ
自己紹介
織田 信亮(おだ しんすけ)
大阪で開発者しています
SQLWorld の代表です

http://d.hatena.ne.jp/odashinsuke/
Twitter:@shinsukeoda
SQLWorld とは
http://sqlworld.org/
Twitter:@SQLWorld_JP
次のような情報を発信しているコミュニ
ティです
  MS の RDBMS である「SQL Server」
  もちろん他の DB の話しも!
  正規化/モデリング
  SQL/NoSQL
注意書き
特定の製品を挙げているように見えます
が、最近よく使ってるからだけで他意は
ありません!
体験談で公式資料は見つけれてません!
本当にあった怖い話し_DB 編
その1:システム要件を満たしているの
に動かない!
その2:バインド変数が動かない!
ODP.NET 4 がシステム要件を満たしている
のに動かない
http://docs.oracle.com/cd/E16338_01/win.112/b66456/I
nstallSystemRequirements.htm#i1006191
ODP.NET 4 がシステム要件を満たしている
のに動かない
  実行環境
   Windows XP SP3
   .NET Framework 4 Client Profile
   .NET 2系は未インストール
   ODP.NET 4
   標準の Widows Update は適用済み
   .NET 3.5 SP1 は除く

      例外発生!!
using System;
using Oracle.DataAccess.Client;
class Program {
  static void Main(string[] args) {
    try {
      Console.WriteLine(typeof(string).Assembly.FullName);
      Console.WriteLine(typeof(OracleConnection).Assembly.FullName);
      var connStr = “~";
      using (var conn = new OracleConnection(connStr))
      using (var cmd = new OracleCommand(@"select SYSDATE from dual", conn)) {
        conn.Open();
        Console.WriteLine(cmd.ExecuteScalar());
      }
    } catch (Exception e) {
      Console.WriteLine(e.Message);
      Console.WriteLine(e.StackTrace);
    }
    Console.ReadKey();
  }
}
using System;
using Oracle.DataAccess.Client;
class Program {
  static void Main(string[] args) {
    try {
      Console.WriteLine(typeof(string).Assembly.FullName);
                        例外発生!
      Console.WriteLine(typeof(OracleConnection).Assembly.FullName);
      var connStr = “~";
      using (var conn = new OracleConnection(connStr))
      using (var cmd = new OracleCommand(@"select SYSDATE from dual", conn)) {
    --------------------------------------------------------------------------------
        conn.Open();
    mscorelib, Version=4.0.0.0, ...
        Console.WriteLine(cmd.ExecuteScalar());
    Oracle.DataAccess, Version=4.112.3.0, ...
      }
    'Oracle.DataAccess.Client.OracleConnection' type iniitalize
    } catch (Exception e) {
      Console.WriteLine(e.Message);
    error ....
      Console.WriteLine(e.StackTrace);
    --------------------------------------------------------------------------------
    }
    Console.ReadKey();
  }
}
ODP.NET 4 がシステム要件を満たしている
のに動かない
  回避策 (どれか一つでOK)
    Windows Update から .NET 3.5 SP1 をイン
    ストール
    C++ の再頒布可能パッケージ をインストー
    ル
     http://www.microsoft.com/ja-jp/download/details.aspx?id=5638

 OTN Discussion Forums
    ODP.NET4 required .NET2.0?
  https://forums.oracle.com/forums/thread.jspa?thr
  eadID=2423728&stqc=true
バインド変数に長い文字列を指定すると動
かない
 某9i で発生!
  10g, 11g では発生せず
バインド変数の値が 2000文字(ASCII) 以
上の物が複数存在するとエラーが発生

ORA-01461:
LONG値はLONG列にのみバインドできま
す。
create table TEST (
  PK number(3,0) not null primary key,
  CONTENT1 varchar2(4000),
  CONTENT2 varchar2(4000),
  CONTENT3 varchar2(4000)
)
/
insert into TEST values (:PK, :CONTENT1, :CONTENT2, :CONTENT3)
/
drop table TEST
/
    結果            CONTENT1      CONTENT2      CONTENT3
    NG            4000文字        4000文字        4000文字
    NG            2000文字        2000文字        0文字
    OK            1999文字        2000文字        1999文字
    OK            1999文字        4000文字        1999文字
バインド変数に長い文字列を指定すると動
かない
 回避策
  9i を使わない
  クエリ内で文字列結合を行い、1バインド変
  数の文字数が大きくならないようにする
create table TEST (
  PK number(3,0) not null primary key,
  CONTENT1 varchar2(4000),
  CONTENT2 varchar2(4000),
  CONTENT3 varchar2(4000)
)
/
insert into TEST values (
  :PK,
  :CONTENT1_1 || :CONTENT1_2 || :CONTENT1_3 || :CONTENT1_4,
  :CONTENT2_1 || :CONTENT2_2 || :CONTENT2_3 || :CONTENT2_4,
  :CONTENT3_1 || :CONTENT3_2 || :CONTENT3_3 || :CONTENT3_4
)
/
drop table TEST
/
まとめ
変な書き方してるクエリを見つけても、
バカにしない!
意味の分からない事象にぶち当たっても
泣かない!
ご清聴ありがとうございました
本当にあった怖い話し_DB 編
おまけ:ストアド × ファンクションで
…
本当にあった怖い話し_DB 編
おまけ:ストアド × ファンクションで
…



   ┌(┌^o^)┐ホモォ...
本当にあった怖い話し_DB 編
おまけ:ストアド × ファンクションで
…



   ┌(┌^o^)┐ホモォ...
ストアド内で複数回呼び出しているファン
クションのトランザクションが異なる
 11g で発生
 非常に複雑なストアド内で同じファンク
 ションを何回も参照している時に発生
  cursor
  共通テーブル式
  with cte as (select ~)
  window 関数
  sum() over (partition by ~)
  union all
サンプルクエリの説明
FOO テーブル
   マスタテーブル
BAR_FUNC
   FOO.HOGE_KBN が ‘1’ はエラー発生
   FOO.HOGE_KBN が ‘2’ はエラーなし
ZOO_PROCEDURE
   FOO、BAR_FUNC を参照
   トランザクションテーブルを更新
   FOO テーブルは更新しない
FOO テーブルのデータ   BAR_FUNC との関係
HOGE_KBN
‘1’            エラー
‘2’            エラーなし

BAR_FUNC では検証用に
RAISE_APPLICATION_ERROR
を使ってエラーを発生させている
-- FOO.HOGE_KBN = ‘1’ はエラー発生、’2’ はエラー発生せず
update FOO set HOGE_KBN = '1'
/
commit
/
select BAR_FUNC(~) from dual -- FOO.HOGE_KBN = ‘1’ なのでエラー発生
/
update FOO set HOGE_KBN = '2'
/
select BAR_FUNC(~) from dual -- FOO.HOGE_KBN = ‘2’ なのでエラー発生せず
/
rollback
/
call ZOO_PROCEDURE (~) -- FOO.HOGE_KBN = ‘1’ なのでエラー発生
/
update FOO set HOGE_KBN = '2'
/
call ZOO_PROCEDURE (~) -- FOO.HOGE_KBN = ‘2’ なのにエラー発生!!
/
ストアド内で複数回呼び出しているファン
クションのトランザクションが異なる
 BAR_FUNC 内で、FOO テーブルのデータを
 確認してみると…
   エラーが起きる時は、何故か更新前のデー
   タを参照している

  同一トランザクション内で更新したはず
  の
  データが見れてない!
ストアド内で複数回呼び出しているファン
クションのトランザクションが異なる
 cursor と 共通テーブル式を辞めても発
 生
 window 関数か union all を辞めると発
 生しなかった
 window 関数と union all を使ったシン
 プルなストアドだと発生しなかった
  再現するミニマムクエリを発見出来ず…
ストアド内で複数回呼び出しているファン
クションのトランザクションが異なる
 回避策
  window 関数は削れなかったので、union
  all を諦めて、2つのクエリに分けた。
  本当に回避出来てるのか不明。
  原因を探れていないので、本当に発生しないのか
  は不明。
  テストでは再現しなかった。
まとめ
変な書き方してるクエリを見つけても、
バカにしない!
テストは大事!
意味の分からない事象にぶち当たっても
泣かない!
ご清聴ありがとうございました

Más contenido relacionado

La actualidad más candente

Wpfと非同期
Wpfと非同期Wpfと非同期
Wpfと非同期
yone64
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISP
Masaomi CHIBA
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 
実はとれました。System xhrでcsv形式のopen dataを取得する
実はとれました。System xhrでcsv形式のopen dataを取得する実はとれました。System xhrでcsv形式のopen dataを取得する
実はとれました。System xhrでcsv形式のopen dataを取得する
Masakazu Muraoka
 
R を起動するその前に
R を起動するその前にR を起動するその前に
R を起動するその前に
Kosei ABE
 
Node.js Error & Debug Leveling
Node.js Error & Debug LevelingNode.js Error & Debug Leveling
Node.js Error & Debug Leveling
kumatch kumatch
 

La actualidad más candente (18)

Mac_Terminal_ver1.0
Mac_Terminal_ver1.0Mac_Terminal_ver1.0
Mac_Terminal_ver1.0
 
Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -Elixirだ 第1回 - 基礎だ -
Elixirだ 第1回 - 基礎だ -
 
Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半Elixirだ 第1回強化版 前半
Elixirだ 第1回強化版 前半
 
Wpfと非同期
Wpfと非同期Wpfと非同期
Wpfと非同期
 
awk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyoawk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyo
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
 
シェル入門
シェル入門シェル入門
シェル入門
 
Python02
Python02Python02
Python02
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
Lisp batton - Common LISP
Lisp batton - Common LISPLisp batton - Common LISP
Lisp batton - Common LISP
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
Rails vim easy
Rails vim easyRails vim easy
Rails vim easy
 
64ビット対応Dllインジェクション
64ビット対応Dllインジェクション64ビット対応Dllインジェクション
64ビット対応Dllインジェクション
 
実はとれました。System xhrでcsv形式のopen dataを取得する
実はとれました。System xhrでcsv形式のopen dataを取得する実はとれました。System xhrでcsv形式のopen dataを取得する
実はとれました。System xhrでcsv形式のopen dataを取得する
 
R を起動するその前に
R を起動するその前にR を起動するその前に
R を起動するその前に
 
菩薩でもわかる!Rで動かすExcelアドインの作り方
 菩薩でもわかる!Rで動かすExcelアドインの作り方  菩薩でもわかる!Rで動かすExcelアドインの作り方
菩薩でもわかる!Rで動かすExcelアドインの作り方
 
Node.js Error & Debug Leveling
Node.js Error & Debug LevelingNode.js Error & Debug Leveling
Node.js Error & Debug Leveling
 
Unix
UnixUnix
Unix
 

Destacado

Destacado (11)

T sql 振り返り
T sql 振り返りT sql 振り返り
T sql 振り返り
 
Webで役立つRDBの使い方
Webで役立つRDBの使い方Webで役立つRDBの使い方
Webで役立つRDBの使い方
 
中国地方Db勉強会
中国地方Db勉強会中国地方Db勉強会
中国地方Db勉強会
 
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
 
Chugokudb18_2
Chugokudb18_2Chugokudb18_2
Chugokudb18_2
 
地方エンジニアがPostgreSQLを通じて成長した話
地方エンジニアがPostgreSQLを通じて成長した話地方エンジニアがPostgreSQLを通じて成長した話
地方エンジニアがPostgreSQLを通じて成長した話
 
2016年を振り返って
2016年を振り返って2016年を振り返って
2016年を振り返って
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
[AWSマイスターシリーズ] AWS CLI / AWS Tools for Windows PowerShell
 

Similar a 本当にあった怖い話し Db編

Sql server data store data access internals
Sql server data store data access internalsSql server data store data access internals
Sql server data store data access internals
Masayuki Ozawa
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
Shota Baba
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
弘毅 露崎
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
Oda Shinsuke
 

Similar a 本当にあった怖い話し Db編 (20)

Tech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LTTech Fielders 2009/9/18 LT
Tech Fielders 2009/9/18 LT
 
Sql server data store data access internals
Sql server data store data access internalsSql server data store data access internals
Sql server data store data access internals
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
 
20100717tobesetu
20100717tobesetu20100717tobesetu
20100717tobesetu
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
Cocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うCocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使う
 
オープンソースRDBMS新機能ランダウンOSC2017TokyoSpring
オープンソースRDBMS新機能ランダウンOSC2017TokyoSpringオープンソースRDBMS新機能ランダウンOSC2017TokyoSpring
オープンソースRDBMS新機能ランダウンOSC2017TokyoSpring
 
MongoDB
MongoDBMongoDB
MongoDB
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
T sql の parse と generator
T sql の parse と generatorT sql の parse と generator
T sql の parse と generator
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
超簡単!Subversion入門 準備編
超簡単!Subversion入門 準備編超簡単!Subversion入門 準備編
超簡単!Subversion入門 準備編
 
Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks Reladomo in Scala #scala_ks
Reladomo in Scala #scala_ks
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
 

Más de Oda Shinsuke

Más de Oda Shinsuke (20)

SQL Server2022_PSPoptimization_pub.pdf
SQL Server2022_PSPoptimization_pub.pdfSQL Server2022_PSPoptimization_pub.pdf
SQL Server2022_PSPoptimization_pub.pdf
 
What's hyperscale
What's hyperscaleWhat's hyperscale
What's hyperscale
 
Dot net+sql server tips
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tips
 
Sql server 2019 ざっくり紹介
Sql server 2019  ざっくり紹介Sql server 2019  ざっくり紹介
Sql server 2019 ざっくり紹介
 
Spark on sql server?
Spark on sql server?Spark on sql server?
Spark on sql server?
 
SQL Server のロック概要
SQL Server のロック概要SQL Server のロック概要
SQL Server のロック概要
 
Blazor 触ってみた
Blazor 触ってみたBlazor 触ってみた
Blazor 触ってみた
 
Linux + PHP でも SQL Server
Linux + PHP でも SQL ServerLinux + PHP でも SQL Server
Linux + PHP でも SQL Server
 
グラフデータベースの話し
グラフデータベースの話しグラフデータベースの話し
グラフデータベースの話し
 
Sql server 2017 新機能のご紹介
Sql server 2017 新機能のご紹介Sql server 2017 新機能のご紹介
Sql server 2017 新機能のご紹介
 
Sql server 2017 からはじめる graph データベース
Sql server 2017 からはじめる graph データベースSql server 2017 からはじめる graph データベース
Sql server 2017 からはじめる graph データベース
 
Transaction scopeまだダメ
Transaction scopeまだダメTransaction scopeまだダメ
Transaction scopeまだダメ
 
Sql serverと他dbの違いを押さえよう!
Sql serverと他dbの違いを押さえよう!Sql serverと他dbの違いを押さえよう!
Sql serverと他dbの違いを押さえよう!
 
Sql world とは
Sql world とはSql world とは
Sql world とは
 
開発者の方向けの Sql server(db) t sql 振り返り
開発者の方向けの Sql server(db) t sql 振り返り開発者の方向けの Sql server(db) t sql 振り返り
開発者の方向けの Sql server(db) t sql 振り返り
 
Sql world とは
Sql world とはSql world とは
Sql world とは
 
Ms build 触ってみよう
Ms build 触ってみようMs build 触ってみよう
Ms build 触ってみよう
 
Sql server2014復習とsqlserver2016の紹介
Sql server2014復習とsqlserver2016の紹介Sql server2014復習とsqlserver2016の紹介
Sql server2014復習とsqlserver2016の紹介
 
Sql server sql database 最新機能紹介
Sql server sql database 最新機能紹介Sql server sql database 最新機能紹介
Sql server sql database 最新機能紹介
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみよう
 

本当にあった怖い話し Db編