Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
ラベル SQL の投稿を表示しています。 すべての投稿を表示
ラベル SQL の投稿を表示しています。 すべての投稿を表示

2021/09/22

Microsoft SQL Serverの開始日時

メモ
SELECT sqlserver_start_time FROM sys.dm_os_sys_info

2020/06/24

SQL Server Management Studio ダークテーマ

管理者権限でconfigファイル書き換えたら選択肢として出てくんのねw
エディタ画面やツールバーは黒くなるけど、ドッキングウィンドウは白背景のままなのね。

output句 inserted.*, deleted.* @@ROWCOUNT

2018.08.10にoutput句のことを知ったらしく、ブログに書こうと思ってメモしていたらしい。よく「vallog ○○」でググるけど出てこなかったので書いておく。特に中身のないメモだけどね。

table変数のことも知らず。Microsoft SQL Serverの本って、もう10年以上読んでないなぁ。たぶんプログラマ1年生の頃に読んだきりだな。あれは2006年か。勉強不足です。当時読んだのは「SQL Server 2005でいってみよう」って本だったかなぁ。



これも知らなかった。


 

2019/10/01

postgres消したろ。drop database postgres;

\c template1
drop database postgres;

psql起動しようとしたところで「あ・・・」
% su postgres -c 'createdb postgres'
Password:
WARNING:  could not flush dirty data: Function not implemented
% psql -U postgres -h localhost -W
Password for user postgres:
事なきを得た。(?)

PostgreSQL テーブル一覧とかカラム一覧とか

とりあえずメモ。PostgreSQLまともに使ったことがなく、以前使ったのも8~9年くらい前でいろいろやらかしてる。drop database postgres;したりとか笑

--テーブル一覧
SELECT
 relname
FROM pg_stat_user_tables
--テーブルコメント一覧
SELECT
 psut.relname AS TABLE_NAME
,pd.description AS TABLE_COMMENT
FROM
 pg_stat_user_tables psut
,pg_description pd
WHERE 1=1
AND psut.relid=pd.objoid
AND pd.objsubid=0
--カラムコメント
SELECT
 pg_stat_user_tables.relname
,information_schema.columns.column_name
,information_schema.columns.data_type
,(
 SELECT
  description
 FROM pg_description
 WHERE 1=1
 AND  pg_description.objoid=pg_stat_user_tables.relid
 AND pg_description.objsubid=information_schema.columns.ordinal_position
 )
FROM
 pg_stat_user_tables
,information_schema.columns
WHERE 1=1
AND pg_stat_user_tables.relname=information_schema.columns.table_name
ORDER BY
 pg_stat_user_tables.relname
--カラム型
SELECT
 table_name
,column_name
,is_nullable
,is_updatable
,data_type
,character_maximum_length
FROM information_schema.columns
WHERE 1=1
--AND table_schema = 'public'
ORDER BY
 table_name
,ordinal_position


2013/07/10

CSVをSQL文に変換する

以前、必要だったのでザックリ書いたスクリプトだけど、便利だったんで結構使用頻度が高い。使うたびに修正したり機能追加されてる。あんまりちゃんとしたスクリプトでもないけど重宝してる。こういうのって普通はExcelとかで生成したりするもんなんだろうか?昔いた会社ではExcelで生成してたなあ。あれはあれで慣れれば便利なのかもしれん。慣れたくないけどな。

SQLつながりだけど、プログラマのためのSQL第4版が出てるんですね。ちょっと読んでみたい。第2版だったかなー、本屋で数時間立ち読m(ゲフンゲフン

2011/04/05

Gauche-dbd-pg を使うにあたって

自分で使うためにいくつかユーティリティ的なものを書いた。粗末だけど取りあえず動いてます。取りあえずさらしておくことに。

そういえば、dbi-connect には undocumented な auto-commit キーワード引数があるっぽい。

with-connection
(use dbi)
(use gauche.parameter)

(define *db* (make-parameter #f))
(define *dsn* (make-parameter #f))
(define *username* (make-parameter #f))
(define *password* (make-parameter #f))

(define-syntax with-connection
  (syntax-rules ()
    ((_ (*db* dsn) . body)
     (with-connection
      (*db* dsn (lambda (dsn)
                  (dbi-connect dsn)))
      . body))
    ((_ (*db* dsn username password) . body)
     (with-connection
      (*db* dsn (lambda (dsn)
                  (dbi-connect dsn
                               :username username
                               :password password)))
      . body))
    ((_ (*db* dsn connector) . body)
     (parameterize
         ((*db* (connector dsn)))
       (guard (e (else
                  (dbi-close (*db*))
                  (raise e)))
         (begin0
             (begin . body)
           (dbi-close (*db*))))))))


.NET の ConnectionStringBuilder みたいなのが欲しいなと思って。
dsn
(use util.match)

(define-class <dsn> ()
  ((platform :init-keyword :platform :initi-value #f)
   (dbname :init-keyword :dbname :init-value #f)
   (host :init-keyword :host :init-value #f)
   (port :init-keyword :port :init-value #f)
   (dsn :init-keyword :dsn :init-value #f)))

(define (%ref-join obj name delim)
  (if-let1 v (~ obj name)
           (string-append
            (symbol->string name) delim v)
           v))

(define-method build! ((con <dsn>))
  (let1 g (cut %ref-join con <> "=")
    (let ((platform (string-append
                     "dbi" ":" (or (~ con 'platform) "")))
          (dbname (g 'dbname))
          (host (g 'host))
          (port (g 'port)))
      (let1 constr (string-append
                    platform
                    (if-let1 dbname dbname
                             (string-append ":" dbname)
                             ""))
        (when host
          (set! constr (string-append constr ";" host)))
        (when port
          (set! constr (string-append constr ";" port)))
        constr))))

(define (build-dsn platform . keys)
  (let-keywords* keys ((dbname #f)(host #f)(port #f))
    (build! (apply make <dsn>
                   :platform platform keys))))

(define (%split-constring constring splitter)
  (let1 splitted (string-split constring splitter)
    (match splitted
      ((base)(values base #f #f))
      ((base host)(values base host #f))
      ((base host port)(values base host port))
      (else (values #f #f #f)))))

(define (%split-base base splitter)
  (let1 splitted (string-split base splitter)
    (match splitted
      ((dbi)(values dbi #f #f))
      ((dbi platform)(values dbi platform #f))
      ((dbi platform dbname)(values dbi platform dbname))
      (else (values #f #f #f)))))

(define-method decompose! ((con <dsn>) constring)
  (let1 v (^n (list-ref (string-split n "=") 1))
    (receive (base host port)
        (%split-constring constring ";")
      (when base
        (receive (dbi platform dbname)
            (%split-base base ":")
          (set! (~ con 'platform) platform)
          (set! (~ con 'dbname)(v dbname))))
      (when host
        (set! (~ con 'host)(v host)))
      (when port
        (set! (~ con 'port)(v port)))
      con)))

transaction, call-with-transaction など。なぜだか transaction クラスを作りました。connection もクラスにしとけばよかったかなと思います。
(use dbi)

(define-class <transaction> ()
  ((connection :init-keyword :connection)
   (begin-query :init-keyword :begin-query :init-value #f)
   (commit-query :init-keyword :commit-query :init-value #f)
   (rollback-query :init-keyword :rollback-query :init-value #f)
   (state :init-keyword :state :init-value 'ready)))

(define-class <pg-transaction> (<transaction>)())

(define-method initialize ((tran <pg-transaction>) initargs)
  (next-method)
  (set! (~ tran 'begin-query) "begin;")
  (set! (~ tran 'commit-query) "commit;")
  (set! (~ tran 'rollback-query) "rollback;"))

(define-method transaction-begin ((tran <transaction>))
  (rlet1 r (dbi-do (~ tran 'connection)(~ tran 'begin-query))
         (set! (~ tran 'state) 'begin)))

(define-method transaction-commit ((tran <transaction>))
  (rlet1 r (dbi-do (~ tran 'connection)(~ tran 'commit-query))
         (set! (~ tran 'state) 'committed)))

(define-method transaction-rollback ((tran <transaction>))
  (rlet1 r (dbi-do (~ tran 'connection)(~ tran 'rollback-query))
         (set! (~ tran 'state) 'rollbacked)))

(define (call-with-transaction proc)
  (let1 tran (make <pg-transaction>
               :connection (*db*))
    (guard (e ((<dbi-error> e)
               (transaction-rollback tran)
               (raise e))
              (else (raise e)))
      (transaction-begin tran)
      (rlet1 r (proc tran)
             (unless (let1 state (~ tran 'state)
                       (or (eq? state 'commeted)
                           (eq? state 'rollbacked)))
               (transaction-commit tran))))))

使う前に少し設定が必要になりますね。
(use file.util)
(use util.list)

(define-constant +server-bin-dir+ "/some/foo/bar")
(define-constant +db-config+
  (load-config (build-path +server-bin-dir+ "conf/db.conf")))

(define (init-module-dbi)
  (let* ((platform (assoc-ref +db-config+ 'db-platform))
         (host (assoc-ref +db-config+ 'db-host))
         (port (assoc-ref +db-config+ 'db-port))
         (dbname (assoc-ref +db-config+ 'db-dbname))
         (user (assoc-ref +db-config+ 'db-user))
         (password (assoc-ref +db-config+ 'db-password)))
    ;; dbi
    (*dsn* (build-dsn platform
                      :host host
                      :port port
                      :dbname dbname))
    (*username* user)
    (*password* password)))

db.conf は例えばこんなの。load-config はここに載ってませんが、load-config で db.conf 読み込むと alist になるような手続きです。
;; -*- mode:scheme; coding:utf-8 -*-

(db-platform "pg")
(db-host "hogehoge.com")
(db-port "5432")
(db-dbname "fuga")
;; (db-user "postgres")
;; (db-password "")


with-connection は with-db を参考にしました。



プログラミングGauche

2011/02/24

PostgreSQL 「The server lacks instrumentation functions. なんたらかんたら」

The server lacks instrumentation functions.

pgAdmin III uses some support functions that are not available by default in all PostgreSQL versions.
These enable some tasks that make life easier when The server lacks instrumentation functions.

After the module is installed, you need to create the instrumentation functions in your maintenance database using the admin.sql script (admin81.sql for PostgreSQL) which are usually located in the pgsql share directory (e.g. /usr/local/pgsql/share)

pgAdmin III 使ってたらこういうのがよく出てきてた。いい加減よく読んでみたら、admin81.sql しなよみたいなことらしいのでその通りに。


ここを参考に。
yum install postgresql-contrib

updatedb
locate adminpack.sql

sudo psql -U postgres < adminpack.sql

で、locate って何よ?と。whereis とか which は使ってましたが locate は知りませんでした。

で、バックアップとかリストアとかも GUI でやると何かとひっかかる。pg_dump, pg_restore の方がすんなり。
テーブル作成後に複合キー付けれなかったり、カラムのデータ型の変更が厳しかったりであたふたしたり。SQL Server は私のようなゆとりにもやさしかったなぁ(白目)。

2011/02/11

cygwin に gauche-dbd-pg

gauche-dbd-pg は、先日 serversman(CentOS)にも入れました。
Emacs から tramp でサーバ側の shell を立ち上げるとローカルの Emacs からサーバ側の gosh REPL にコードを送ることができるので、サーバの PostgreSQL を操作するプログラムをローカルで開発できます。

できますが、例えば何かモジュールを作ってそれを利用するようなコードを書いた時にそのモジュールをサーバにアップロードしてからでないとテストができません。アップロードといっても、tramp を用いてローカルの Emacs の dired から直接コピーできるのですが、その一手間が面倒です。それに gosh の再起動もしくは reload 等も必要になります。一手間どころか、そもそもモジュールに変更があるたびに手作業が発生するなんて狂気の沙汰。
開発のサイクルのなかで、モジュールを再ロードしなければならないことは 頻繁におこります。このモジュールはそれを支援するものです。

ということで、ローカルの cygwin にも gauche-dbd-pg を入れて、ネットワーク越しにサーバの PostgreSQL に接続できるようにすることにしました。

当然ですが PostgreSQL の方も設定が必要。

で、cygwin の setup から postgresql を入れて、gauche-dbd-pg をダウンロードして展開して ./configure で make ・・・ でコケました。
dbd_pglib.c:817: error: too few arguments to function `Scm_Apply'
GAUCHE_API_PRE_0_9 のことを教えてもらって、試しましたがうまくいきませんでした。
で、もう一度エラーメッセージをよく見ていたら、以前 serversman に入れた時も見たことがあるような気がしてきました。確か、kahua のページにある gauche-dbd-pg-0.2.1 を入れようとした時に見た気がします。
0.2.1 が同様のエラーでうまく入らなかったから trunk から持ってきて入れたんでした。で、今回もその trunk から入れてるつもりでしたが、持ってくるものを間違ってました。

これ
を入れないといけないのに、これ
を持ってきてました。うっかり。で、後者前者の trunk は何の問題もなく入りました。
(use dbi)
(use dbd.pg)

(dbi-open?
 (dbi-connect "dbi:pg:dbname=test;port=5432;host=example.com"
              :username "postgres" :password "hoge"))
;; -> #t
ところで、dbi 周りには transaction 系の api がなさげ?with-transaction 的なものが欲しいです。取りあえず自前で用意することになりそうですかね。

で、ネットに落ちてる gauche-dbd-* を用いたコードを眺めていましたが、あまりたくさんはなさそうですね。。
Ruby の ActiveRecord みたいのを mop で実現してる(?)のがなんかすごそう。

プログラミングGauche

2011/02/03

postgres timestamp

どうも postgres 初心者です。date 型と time 型はあるけど、datetime 型ってないの?ドキュメントには datetime ってあるけど、pgAdmin で見あたらない。。
ということで  @kikuchan98 さんに聞いてみたら、どうやら欲しいのは timestamp 型っぽい。
postgres=# select current_timestamp;
   now
   -------------------------------
   2011-02-02 13:50:27.402093+09
   (1 行)

   postgres=# select extract(epoch from current_timestamp);
   date_part
   ------------------
   1296622247.69678
   (1 行)

   postgres=#


たまに日付を扱うときに int 型で扱ってる DB ありませんか。datetime 型じゃなくて int 型を使うメリットって何かあるんでしょうか。話によると varchar なとこもあったりするそうでェ。
実際、昔勤めていた会社が日付を int 型で扱ってたんですよね。20110203 みたいな。理由を聞いてもハッキリしたことは教えてもらえませんでした。なんとなく、だったのかな。お陰で日付を扱うのが面倒でしたよ。


新標準PostgreSQL (オープンソースRDBMSシリーズ)

2011/01/28

PostgreSQL のストアドを Scheme で

これも @kikuchan98 さんに教えてもらいました。
裏では Guile が動くみたいです。

まだ PostgreSQL 自体の扱い方がいまいちわかんないような状態なので、これを使うようなことはもう少し先のお話かも。
ようやく Serversman に入れた PostgreSQL にローカルからネットワーク越しにアクセスできるようになったところです。

余談

SQL で木構造扱うのって悩みの種だと思うんですが、RDB 向けのデザインパターンみたいなノリでサンプル集が欲しいなどと思うわけです。

こことか参考になります。
日本語ではこういう情報ってあまり見かけませんよね。

SQL で木構造や階層構造を扱うってんで以前、隣接モデルでやったことはあるんですが結構大変でした。
何回 join すんだよ、決め打ちか?みたいな。抽象度低くね?みたいな。

で、今回は Nested Set Model について一通り調べてみて、サンプル書いてみたりしたんですが、これもこれで大変そうな。。

「だったらストアドにすればいいじゃん。ポスグレなら Scheme でも書けるよ。」
「な、なんだってー!」 > ΩΩ Ω ザワザワ

別に Transacto-SQL とかを書くのは嫌いじゃないですけど、Scheme で書けるとなると書いてみたいですね。


あと、もう一つ気になったのが、DB のサンプル少なくないですか?
私が見つけられなかっただけでしょうか。。

「マ○ドナルドのメニューとか CSV で落ちてそうじゃね?」などと思って探してみたり。
郵便番号辞書から階層データ作るのも、なんだかなーだし。

今回は結局自分で手打ちすることに・・・。
最初に思いついた、ドリンクメニューにしました。

  • 飲み物
  • ジュース
    • オレンジ
    • コーラ
    • カルピス
  • アルコール
      • 美少年
      • ずいよう
    • 焼酎
        • 白岳
        • 伊佐錦
        • 伊佐美
        • 白波
        • 魔王
        • 森伊蔵
        • 佐藤
        • 霧島
        • 黒麹
          • 黒伊佐錦
          • 黒白波
          • 黒佐藤
          • 黒霧島
        • 二階堂
        • いいちこ
      • 黒糖
        • 喜界島
        • れんと
      • その他
        • たんたかたん
    • カクテル
    • ワイン
    • ブランデー
    • ウィスキー
    • ビール
      • 国内
      • 国外
  • コーヒー
  • お茶
  • ・・・
みたいな。
できあいのこういうデータがCSVか何かで複数あったらうれしくないですか?

こういうジョジョの系譜のデータとかね。


MSSQL だったら pubs, northwind, adventure works なんかもありますし、postgres でも sample DB があるにはありました。
でもなんか、あんまり親切じゃないようなイメージです。
詳しいドキュメントとか、ER 図とか、ER 図とか、あると嬉しいんですけどね。



PostgreSQL完全機能リファレンス―実行例を通して「理解」を深める。

node.js + postgreSQL

node.js 自体のインストールは特に問題なく。
CentOS と Cygwin に入れました。

python が入ってないと要求される

node_postgres の方。
(cygwin には入れてない)
  • MySQLもPostgreSQLもちゃんと使える
ダウンロードして展開して README よろしく
node-waf configure build
で入りました。

で、
npm install .
すると、node_postgres 同梱の test.js も無事動きました。
record は配列の配列で返ってくるみたいですね。

lisp.js

今日 @kikuchan98 さんに「node.lisp みたいなのがあるらしいよ」と教えてもらったので検索してみた。
これかな。

@kikuchan98 さんは既に node.js でいくつかモノを作られていて、一個見せてもらった。
node.js が動いてるサーバーにとある自作機器がつながっていて、Web 経由で node.js とお話して接続された機器経由でまた別のとあるモノを制御するという一品。
すげー。

もう一個はできてからのお楽しみということで教えてもらえなかった。
きっと #9LISP とかで見せてもらえるに違いない。

自分はといえば、写経とかハンズオンとかそんな状態。。

参考


JavaScript Patterns

2011/01/22

serversman(centos) に postgreSQL に Gauche-dbd-pg

会社では主に postgreSQL が使われているようです。

今までの仕事では SQL Server メインでした。
あとは MySQL を少し。

今のところ会社ではローカルに SQL Server を入れています。
せっかくなので ServersMan に postgreSQL を入れてみることにしました。

postgreSQL は当初 Lisp で書かれていたとかいないとか。
postgreSQL は Lisp でストアドが書けるとか書けないとか。
そういう話を聞いたことがありますが、まじですか?

postgreSQL

ここを参考に。

gauche-dbd-pg

Gauche-dbd-pg-0.2.1 は make でコケて入りませんでした。
trunk から持ってきたら、どうやらうまくいったみたいです。

$ gosh
gosh> (use dbi)
#<undef>
gosh> (use dbd.pg)
#<undef>
gosh> (let1 con (dbi-connect "dbi:pg:dbname=test")
        (values (dbi-open? con)
                (is-a? con <pg-connection>)
                (dbi-close con)
                (dbi-open? con)))
#t
#t
#<undef>
#f
gosh>

参考


プログラミングGauche

2011/01/20

カラムのコメントを取得する(mssql)


ここにコメント書いておけば、簡単なテーブル定義書出せるんじゃね?


declare @tablename varchar (30)
set @tablename = 'employee'

select
  cols.column_id as col_id
  ,left(cols.name, 20) as col_name
  ,left(types.name, 15) as type_name
  ,cols.max_length as col_length
  ,(case cols.is_nullable
    when 0 then 'no'
    when 1 then 'yes'
    else 'nothing'
    end) as nullable
  ,left(cast(ext.value as varchar), 50) as comment
from
  sys.columns as cols
left outer join
  (select
    name
    ,types.system_type_id
  from
    sys.types as types
  where
    is_user_defined = 0
  group by
    types.system_type_id
    ,types.name) as types
on
  types.system_type_id = cols.system_type_id
left join
  sys.objects as obj
on
  obj.object_id = cols.object_id
left join
  sys.extended_properties as ext
on
  cols.object_id = ext.major_id
and
  cols.column_id = ext.minor_id
where
  obj.name like @tablename
order by
  column_id
go

sp_tables
sp_columns
sp_pkeys
sp_fkeys

参考


SQLパズル 第2版 プログラミングが変わる書き方/考え方

Re:Emacs でインタラクティブに SQL する

書き換えたので再掲。
  • sqlcmd を使ってるつもりが、osql だったので sqlcmd に
  • ちゃんと追求してないけど、2度目以降の run-mssql で sql-ms-options がおかしくなるので場当たり的な対応 reset/run-mssql 追加
  • sql-indent.el のインデントのための正規表現に join 系他を追加
  • hook を追加
あとは、改行する時に自動でインデントしてくれると嬉しいんだけどなぁ。。
それと、なぜか sql-indent-buffer, sql-indent-region するとインデントがなくなる・・・。
;; C-c C-c : 'sql-send-paragraph
;; C-c C-r : 'sql-send-region
;; C-c C-s : 'sql-send-string
;; C-c C-b : 'sql-send-buffer
(require 'sql)

;; starting SQL mode loading sql-indent / sql-complete
(eval-after-load "sql"
  '(progn
     (load-library "sql-indent")))

(custom-set-variables
 `(sql-indent-first-column-regexp
   ,(concat "^\\s-*" (regexp-opt
                      '("select" "update" "insert" "delete"
                        "union" "intersect"
                        "from" "where" "into" "group" "having" "order by"
                        "set"
                        "create" "drop" "truncate"
                        "left join" "right join" "inner join"  "cross join" "on"
                        "left outer join" "right outer join" "inner join"
                        "begin" "rollback" "commit"
                        "and" "or"
                        "go"
                        "--")
                      t)
            "\\(\\b\\|\\s-\\)")))

(setq auto-mode-alist
      (cons '("\\.sql$" . sql-mode) auto-mode-alist))
(sql-set-product-feature
 'ms :font-lock 'sql-mode-ms-font-lock-keywords)

(custom-set-variables
 '(sql-ms-program "sqlcmd"))
(custom-set-variables
 '(sql-ms-options  '("-U" "-P" "-S" "-d")))

(sql-set-product-feature
 'ms :sql-program 'sql-ms-program)
(sql-set-product-feature
 'ms :sqli-prompt-regexp "^[0-9]*>")
(sql-set-product-feature
 'ms :sqli-prompt-length 5)
(sql-set-product-feature
 'ms :sqli-login 'sql-ms-login-params)
(sql-set-product-feature
 'ms :sqli-connect 'sql-connect-ms)

(add-hook 'sql-mode-hook
          #'(lambda ()
              (setq sql-indent-offset 2)
              (setq sql-indent-maybe-tab t)
              (local-set-key "\C-cu" 'sql-to-update)
              (setq sql-pop-to-buffer-after-send-region nil)))
(add-hook 'sql-interactive-mode-hook
          #'(lambda ()
              (set-buffer-process-coding-system 'sjis-unix 'sjis-unix )
              (setq show-trailing-whitespace nil)
              (setq comint-buffer-maximum-size 500)
              (setq comint-input-autoexpand t)
              (setq comint-output-filter-functions
                    'comint-truncate-buffer)))

(defun sql-connect-ms ()
  (let ((login-params (mapcar #'(lambda (e)
                                  (symbol-value (symb 'sql- e)))
                              sql-ms-login-params)))
    (let* ((options (mapcar* #'cons
                             sql-ms-options
                             login-params))
           (params (fold-right
                    #'(lambda (e acc)
                        (if (cdr e)
                            (append (list (car e)(cdr e))
                                    acc)
                          acc))
                    nil options)))
      ;; (setq sql-ms-options (append params (list "-W")))
      (setq sql-ms-options params)
      (sql-connect-1 sql-ms-program sql-ms-options))))

(defun run-mssql ()
  (interactive)
  (sql-product-interactive 'ms))

(defvar backup:sql-ms-options sql-ms-options)
(defvar backup:sql-ms-login-params sql-ms-login-params)

(defun sql:reset-parameters ()
  (interactive)
  (setq sql-ms-options backup:sql-ms-options)
  (setq sql-ms-login-params backup:sql-ms-login-params)
  (setq sql-user nil)
  (setq sql-password nil)
  (setq sql-server nil)
  (setq sql-database))

(defun reset/run-mssql ()
  (interactive)
  (sql:reset-parameters)
  (run-mssql))

他に必要なもの

(defun fold (kons knil ls &rest more)
  (do ((ls ls (cdr ls)) (more more (mapcar #'cdr more))
       (knil knil (apply
                   kons
                   (apply #'list (car ls) (append (mapcar #'car more) (list knil))))))
      ((null ls) knil)))

(defun fold-right (kons knil ls &rest more)
  (apply #'fold kons knil (reverse ls) (mapcar #'reverse more)))

(defun mkstr (&rest args)
  (with-output-to-string
    (dolist (a args) (princ a))))

参考


SQL Hacks ―データベースを自由自在に操るテクニック

2011/01/12

RDB Design Patterns : 「リレーショナルデータベースのデザインパターン」ってないの?

プログラマのためのSQL 第2版

データベースやテーブル設計にもデザインパターン集とかあってもよくね?と思って検索したら、Stack Overflow にスレッドがありました。
メモがてら。

リファクタリング―プログラムの体質改善テクニック」のマーティン・ファウラー先生はデータベースのことも書いてらっしゃるんですね。

この本が評判良いの?
これが和訳?
作者のところに名前はないけど、原書の最後の(Flowler)ってマーティン・ファウラー先生のこと?


他のスレッドに出てた本
  1. SQL Design Patterns: Expert Guide to SQL Programming (It in-Focus Series)
  2. Data Model Patterns: Conventions of Thought
  3. Data Model Patterns: A Metadata Map (The Morgan Kaufmann Series in Data Management Systems)
  4. Joe Celko's SQL Programming Style (The Morgan Kaufmann Series in Data Management Systems)
  5. Data Modeling Essentials, Third Edition (The Morgan Kaufmann Series in Data Management Systems)
  6. Applied Mathematics for Database Professionals (Expert's Voice)
どれも重そうだー。1の本とかタイトルからしてモロ。4の本も内容が気になる。

ウェブサイト

さっきの本の。

ER 図たくさん。正直、よくわからん。

これはデータベース初級者から上級者への道的な何か?

これはまさにデータベースデザインパターン?

わからん。けど取りあえずそれっぽいものを。

プログラマのためのSQL第四版

プログラマのためのSQL 第2版」は本屋でもよく見かけますね。ぶ厚いやつですよね。これって、第二版なのか。第三版、第四版は翻訳されないんでしょうか。
この辺りって、日本語の情報が少なくないですか?誰か和訳たのむ。。

ER図エディタ


Refactoring Databases: Evolutionary Database Design (Addison-Wesley Signature Series (Fowler))データベース・リファクタリング

2011/01/11

Emacs でインタラクティブに SQL する (Microsoft SQL Server 2005 編)


下記の設定は Microsoft SQL Server ですが、少し書き換えれば他の RDB でも使えるはずです。
今回対象にしたのは, SQL Server 2005 です。

必要なものは
auto-install で入りました。なかなか便利になりました。
Management Studio は重苦しいので少し不満でした。Emacs キーバインドになりそうもありませんし。Enterprise Manager の軽さが懐かしいです。

以下設定。

.emacs

;; C-c C-c : 'sql-send-paragraph
;; C-c C-r : 'sql-send-region
;; C-c C-s : 'sql-send-string
;; C-c C-b : 'sql-send-buffer
(require 'sql)

(add-hook 'sql-interactive-mode-hook
          #'(lambda ()
              (interactive)
              (set-buffer-process-coding-system 'sjis-unix 'sjis-unix )
              (setq show-trailing-whitespace nil)))

;; starting SQL mode loading sql-indent / sql-complete
(eval-after-load "sql"
  '(progn
     (load-library "sql-indent")
     (load-library "sql-complete")
     (load-library "sql-transform")))

(setq auto-mode-alist
      (cons '("\\.sql$" . sql-mode) auto-mode-alist))

(sql-set-product-feature
 'ms :font-lock 'sql-mode-ms-font-lock-keywords)

(defcustom sql-ms-program "sqlcmd"
  "Command to start sqlcmd by SQL Server."
  :type 'file
  :group 'SQL)

(sql-set-product-feature
 'ms :sql-program 'sql-ms-program)
(sql-set-product-feature
 'ms :sqli-prompt-regexp "^[0-9]*>")
(sql-set-product-feature
 'ms :sqli-prompt-length 5)

(defcustom sql-ms-login-params
  '(user password server database)
  "Login parameters to needed to connect to mssql."
  :type '(repeat (choice
                  (const user)
                  (const password)
                  (const server)
                  (const database)))
  :group 'SQL)

(defcustom sql-ms-options '("-U" "-P" "-S" "-d")
  "List of additional options for `sql-ms-program'."
  :type '(repeat string)
  :group 'SQL)

(defun sql-connect-ms ()
  "Connect ti SQL Server DB in a comint buffer."
  ;; Do something with `sql-user', `sql-password',
  ;; `sql-database', and `sql-server'.
  (let ((f #'(lambda (op val)
               (unless (string= "" val)
                 (setq sql-ms-options
                       (append (list op val) sql-ms-options)))))
        (params `(("-U" . ,sql-user)("-P" . ,sql-password)
                  ("-S" . ,sql-server)("-d" . ,sql-database))))
    (dolist (pair params)
      (funcall f (car pair)(cdr pair)))
    (sql-connect-1 sql-ms-program sql-ms-options)))

(sql-set-product-feature
 'ms :sqli-login 'sql-ms-login-params)
(sql-set-product-feature
 'ms :sqli-connect 'sql-connect-ms)

(defun run-mssql ()
  "Run mssql by SQL Server as an inferior process."
  (interactive)
  (sql-product-interactive 'ms))


初めは osql を使おうとしていたのですが、クエリを投げたあと戻ってきませんでした。。
osql をやめて sqlcmd に変えたらうまく動いたみたいです。

SQL Server の設定


画像のデータは定番の pubs のデータです。

osql, sqlcmd

osql, sqlcmd を単体で使う場合。
>osql -U username -S servername
>osql -U usename -S servername -d pubs -i test.sql
sqlcmd も同様。

Emacs version

Emacs のバージョンは (emacs-version) してみたら
"GNU Emacs 24.0.50.1 (i386-mingw-nt5.1.2600)
of 2010-07-02 on YAMALOK"
でした。

追記

sqli-prompt-regexp のとこと、sql-connect-ms を少し書き換えました。

プログラマのためのSQL 第2版

2009/09/02

SharePoint SP2 適用後の構成ウィザードエラー

「SharePoint 製品とテクノロジの構成ウィザード」にて

今回はOffice Projectをインストールした際。

 

 

例外メッセージ

サーバー上でエラーが発生しました。http://go.microsoft.com/fwlink?LinkID=96177

イベントログ確認

hoge 上のデータベース WSS_Content のスキーマ バージョン (3.1.3.0) は、foo 上の予期されたデータベース スキーマ バージョン (3.1.8.0) と一致しません。データ損失を防ぐため、このサーバーからこのデータベースへの接続はブロックされました。Web フロント エンドまたはコンテンツ データベースをアップグレードして、これらのバージョンを一致させてください。

解決方法を検索

スキーマのアップグレード方法について

「イベント ログに記載されている関連データベースそれぞれに関して、データベース内の Versions テーブルにアクセスし、スキーマ バージョンの古い数字を新しい数字に (手動で) 変更しなければならない」
http://blogs.microsoft.co.il/blogs/adlaim/archive/2007/10/26/the-schema-version-3-0-149-0-of-the-database-sps-content-db-on-moss.aspx(英語)

2009/05/11

[Sql][bat]bcpでSelect文を実行する

データベースDbNameのHogeTableをSelectした結果をlogファイルに吐きます。userは、まぁsaとか、****は実際のパスワードに変えて実行するとOK。

bcp "USE DbName Select * From HogeTable" queryout "c:\select.log" -t "," -c -U user -P ****

osqlの方が一般的ですね。
@osql -Uuser -P**** -Sservername -ddbname -q "SELECT * FROM HogeTable"


[Sql]バックアップ

メモ。データベースバックアップ。MSSQL。

 

dbback.sql

BACKUP DATABASE [TableName] TO DISK = N'\\ServerName\Common\TableName.bak'

 

dbback.bat

osql -S (local) -U sa -P  -i dbBack.sql -o dbBack.log