Oracle にも OFFSET FETCH が入ってたので Doma の対応コード書いてみた。

仕事で Oracle12c を触る機会があって気付いたのですが、Oracle12c から OFFSET FETCH が入ってたようです。
第37回 新しいSQLについて
構文が SQL Server と似た感じですね。
※正確な構文はこちらから SELECT

SQL Server との違いで ORACLE の方が便利そうな箇所は、

  1. ORDER BY が無くてもOK (普通 ORDER BY 書くけどね)
  2. OFFSET は省略可 (先頭からN件とる場合)
  3. FETCH で指定する方法が行数と割合(%)で指定可 (全体の5%とか)
  4. fetch で with ties を指定すると、最後のデータと同じものは指定行数を超えても含まれる。

SQL Server の方が便利そうな箇所は、

  1. FETCH を省略可 (先頭N件をスキップして残り全部とる場合)

使うかどうかは置いといて機能的には負けてますね。。

で、Welcome to Doma — Doma 2.0 ドキュメント も使ってたので、12C用の PagingTransformer 書いてみました。
雰囲気動きそうな感じです。percent や with ties には対応していませんが、ちょっと使う分にはこれで良いかなー。

/*
 * Copyright 2004-2010 the Seasar Foundation and the Others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.seasar.doma.internal.jdbc.dialect;

import static org.seasar.doma.internal.Constants.ROWNUMBER_COLUMN_NAME;

import org.seasar.doma.internal.jdbc.sql.node.FragmentNode;
import org.seasar.doma.internal.jdbc.sql.node.FromClauseNode;
import org.seasar.doma.internal.jdbc.sql.node.SelectClauseNode;
import org.seasar.doma.internal.jdbc.sql.node.SelectStatementNode;
import org.seasar.doma.internal.jdbc.sql.node.WhereClauseNode;
import org.seasar.doma.jdbc.SqlNode;

/**
 * @author taedium
 * 
 */
public class Oracle12PagingTransformer extends OraclePagingTransformer {

    public Oracle12PagingTransformer(long offset, long limit) {
        super(offset, limit);
    }

    @Override
    public SqlNode visitSelectStatementNode(SelectStatementNode node, Void p) {
        if (processed) {
            return node;
        }
        processed = true;

        OrderByClauseNode originalOrderBy = node.getOrderByClauseNode();
        OrderByClauseNode orderBy = node.getOrderByClauseNode();
        if (originalOrderBy != null) {
            orderBy = new OrderByClauseNode(originalOrderBy.getWordNode());
            for (SqlNode child : originalOrderBy.getChildren()) {
                orderBy.appendNode(child);
            }
        } else {
            orderBy = new OrderByClauseNode("");
        }

        if (this.offset > 0) {
            orderBy.appendNode(new FragmentNode(" offset "));
            orderBy.appendNode(new FragmentNode(String.valueOf(this.offset)));
            orderBy.appendNode(new FragmentNode(" rows"));
        }

        if (this.limit > 0) {
            orderBy.appendNode(new FragmentNode(" fetch first "));
            orderBy.appendNode(new FragmentNode(String.valueOf(this.limit)));
            orderBy.appendNode(new FragmentNode(" rows only"));
        }

        SelectStatementNode result = new SelectStatementNode();
        result.setSelectClauseNode(node.getSelectClauseNode());
        result.setFromClauseNode(node.getFromClauseNode());
        result.setWhereClauseNode(node.getWhereClauseNode());
        result.setGroupByClauseNode(node.getGroupByClauseNode());
        result.setHavingClauseNode(node.getHavingClauseNode());
        result.setOrderByClauseNode(orderBy);
        result.setForUpdateClauseNode(node.getForUpdateClauseNode());
        result.setOptionClauseNode(node.getOptionClauseNode());
        return result;
    }
}

JDBC Driver for SQL Server がオープンソースに & Maven リポジトリにも登録されました!

Open sourcing the Microsoft JDBC Driver and Maven support – Microsoft JDBC Driver for SQL Server Team Blog

GitHub はこちら
GitHub - Microsoft/mssql-jdbc: The Microsoft JDBC Driver for SQL Server is a Type 4 JDBC driver that provides database connectivity with SQL Server through the standard JDBC application program interfaces (APIs).

issues も上げてねーだって。 セキュリティに関するやつはここに書かないでメールでよろだそうです。

2016 SP1 で Edition 間の機能差異が減って、同じバイナリで Linux でも動くようにして、 JDBC Driver も OSS 化してと。

なんなんですかねー?これ。
触る時間足りないわー。

JDBC Driver のコードリーディングとかやりたいなー。
チラ見したら java.util.Vector とかいたり、インデントや括弧の位置がバラバラだったりやけど。。
興味ある人いるかな?

SQL Server for Linux ちょっとだけ触りました!

Announcing SQL Server on Linux public preview, first preview of next release of SQL Server | SQL Server Blog
SQL Server v.Next—SQL Server on Linux | Microsoft

日本語は 11/17 の SQL Server の発表について at SE の雑記
で。

Azure の VMSQL Server vNext on Red Hat Enterprise」 で VM 作成。
SQL Server for Linux で検索したら出てきます。

Network Security Group で サービス MS SQL を追加しておきます。
TCP で 1433 空ける設定してくれます。デフォは ssh しか空いてない。

展開した VM
Install SQL Server on Red Hat Enterprise Linux - SQL Server vNext CTP1 | Microsoft Docs
の 4 までと 7 が終わってる状態でした。
※sudo firewall-cmd --zone=public --list-ports で 1433 があった。

5 叩いたて sa のアカウントとか設定したら SQL Server を起動出来るようになります。

SSMS で繋がるし、

CLR に依存している関数も動いた!
FORMAT (Transact-SQL)

このへんはどうなってるんですかねー?

ここまで20分掛からずで出来ました、便利になりましたねー。

12/17(土) 第4回 関西DB勉強会 開催します!

第3回 からちょっと期間があきましたが第4回やります!

今回は MySQLMariaDBPostgreSQL のお話しが中心です。
kansaidbstudy.connpass.com

お時間あるかたは是非ご参加を~。

Azure SQL Database の Free の日本語ポータルの記載が間違ってる。。追記:直りました

2016/11/19 追記:表記直りましたー

この前知ったのですが、SQL Database の FREE 版ってまだ残ってたんですね~。
で、日本語ポータルの表記が間違ってました。

日本語

英語

日本語だと容量が 32GB までとなってますが、32MB の誤りです。
ポータルからフィードバック投げたけど未だ直らないのでブログに書いてみました。。

ちなみに FREE 版は、普通に SQL DB だけ作っても選択出来ません。
Web App と一緒に作成すると、FREE 版を作れます。
azure.microsoft.com
※昔にあった 20MB 無料相当の互換だと思います。ちなみに V12 でした。

Unity Style Developer#1 で 質問してきました! #unistyle

Unity Style Developer#1 - connpass に参加してきましたー。

Unity - Game Engine って iOS/Android 作れるんでしょ?
って位しか知らないど素人でしたが、対応プラットフォーム多いんですね!

ハンズオンのセッションがあって、当日に Unity インストールしましたが楽しめました~。
HTC Vive の実機ありセッションもあって楽しかったです。

で、LT お願いされてたので、何話そうか考えたけど触ってないし話せること無いから、 中の人来てるし質問を答えてもらおう!って感じのLTというかショートセッションというかをやりました。

一応 Data Platform の MVP なので、Data にまつわるところを聞いてきました。
また、会場の参加者からも質問が上がったのでその時のメモを公開します。*1

Q.ローカルにデータを持つ方法パッと調べた感じこんなの見つかったけど、他にも方法あるの?
1.PlayersPrefs
2.ScriptableObject
3.DB(Sqlite?)
4.外部ファイル - txt(json)
5.外部ファイル - binary (msgpack / flatbuffers ?)
6.asset
7.それ以外

A.概ね 1-6 で合ってるよー。
PlaysersPrefs
  =>設定用 (key / url 等の config とか小さいデータ用)
    大きいデータいれると起動が遅くなる、メモリ大量に必要
    =>起動時に読み込むため
ScriptableObject
  =>書き込み出来ない (Read Only)
PlayersPrefs / ScriptableObject / asset は Unity の機能で面倒みてくれる。

外部ファイルや DB は自前で保存/読込実装してね。
json そのままは辞めた方が良いよ。よく使われてるけど

個人的には msgpack よく使ってます。


Q.暗号化ってあるの?

A.Unity では暗号化の機能は持っていない
 =>解析されると、それを使っている全アプリが解析されることになるので、そこまで担保出来ないから


Q.サーバーから取ってきたデータのキャッシュみたいなのはどの方法で?

A.データが少ないなら ScriptableObject (実装?が面倒)
大きいなら DB とか


Q.PCL(Portable Class Library) 使えるの?

A.PCL の事知らないのでわかりません。
  (会場で調べた人から)たぶん使え無さそうという情報が


Q.ソース管理で大きいファイルがあって、某クラウドソース管理でアップに失敗する

A.大きいファイル含めないようにするとか
 [https://unity3d.com/jp/services/collaborate]  では、Write データ含めない
 =>無料だけど、未だβ版


Q.PlayersPrefs に 100個の int[] 保存するの遅くなる?

A.使っても構わないけど、PlayersPrefs 使うより、自前でSystem.IO使って読み書き(シリアライズ/デシリアライズ)した方がたぶん速いよ。
Web のプラットフォームだと、System.IO 使えないけど。

間違いとかあれば教えてくださいー。

*1:聞き間違い等で誤った内容を書いてるかもしれません。

Row-Level-Security BLOCK PREDICATE のメモ

行レベルのセキュリティ
いつの間にか 日本語MSDN提供されてました。
追加/更新操作の制限は、トランザクション単位ではなくクエリ単位だよというメモ。

create table [dbo].[Table] (
  [Id] int
)
go
create schema [rls]
go
create function [rls].[TablePredicate](@Id int)
  returns table
  as return select 1 as [Result] where @Id <> 1
go
create security policy [rls].[TablePolicy]
  add block predicate [rls].[TablePredicate]([Id]) on [dbo].[Table] after insert

Id = 1 は INSERT 出来ない制限を掛けたときに、

begin tran 
insert into [dbo].[Table] ([Id]) values (1)
update [dbo].[Table] set [Id] = 2 where [Id] = 1
commit

はエラーになります。
トランザクションとしては、結果的に Id = 1 の列は追加されていませんが普通の動きですね。*1

クエリ全文

create table [dbo].[Table] (
  [Id] int
)
go
create schema [rls]
go
create function [rls].[TablePredicate](@Id int)
  returns table
  with schemabinding
  as return select 1 as [Result] where @Id <> 1
go
create security policy [rls].[TablePolicy]
  add block predicate [rls].[TablePredicate]([Id]) on [dbo].[Table] after insert
go

begin tran 
insert into [dbo].[Table] ([Id]) values (1)
update [dbo].[Table] set [Id] = 2 where [Id] = 1
commit
go

drop security policy [rls].[TablePolicy]
go
drop function [rls].[TablePredicate]
go
drop schema [rls]
go
drop table [dbo].[Table]
go

*1:分離レベル低いと SELECT から見えちゃうし...