frog.raindrop.jp.knowledge > MSDE/SQL Server
MSDE・T-SQLの話題が中心です。

January 28, 2009

Microsoft SQL Server Express の認証モード

以前に MSDEで統合Windows認証<->SQLServer認証を切り替える というのを書きましたが、SQL Server Express では以下のレジストリ位置になるみたいです。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer]
"LoginMode"=dword:00000002

レジストリの値は変わらないみたい。

認証の種類
統合Windows認証 dword:00000001
SQL Server認証 dword:00000002

あと、osql から接続する場合は、[SQL Server 2005 セキュリティ構成] を起動して、[サービスと接続のセキュリティ構成] より、リモート接続を有効にする必要があるみたいです。

March 9, 2004

ワークロード・ガバナ

MSDE 2000は、製品版のSQLServerとの差異化を図るために、9個以上同時に処理を行うと、パフォーマンスを低下させるような機構が組み込まれている。詳しい情報のありか、Microsoft SQL Server - SQL Server 2000 ワークロード ガバナについて

SQL Server 2000 Desktop Engine (MSDE 2000) および SQL Server 2000 Personal Edition に同梱されている Microsoft® SQL Server™ 2000 データベース エンジンには、ワークロード ガバナが付属しています。ワークロード ガバナは、ユーザーが少ない場合の一般的な負荷を超える負荷がデータベース エンジンにかかった場合にパフォーマンスを制限するようなデザインになっています。
詳しい情報を記載したWordのドキュメントがあります。

February 26, 2004

主キーを別のファイルグループに作成したくても・・・

MSDEで、表とプライマリキーを別々のファイルグループに作成しようとしたが、できなかった。たとえばこんな感じで表とプライマリーキーを作成したとする。

C:\>osql -S (local) -U sa -P mypass
1> USE master
2> GO
1> CREATE TABLE student_tbl
2> (
3>      enter_year      CHAR( 4 ) NOT NULL,
4>      id              CHAR( 8 ) NOT NULL,
5>      sex             CHAR( 1 ),
6>      phone   CHAR( 12 ),
7>      name    VARCHAR( 20 ),
8>      address VARCHAR( 80 )
9> ) ON STUDENTDB_MAIN;
10> GO
1> ALTER TABLE student_tbl
2> ADD CONSTRAINT pk_student_tbl
3> PRIMARY KEY
4> (
5>      enter_year,
6>      id
7> ) ON STUDENT_INDEX;
8> GO
1>

結果はどうなるか。実は、表もプライマリキーのインデックスも、両方STUDENT_INDEXファイルグループに作成されてしまう。

続きを読む...

MSDEのデータをエクスポート・インポートするJScript

MSDEのデータを手軽にExport/ImportするWSHスクリプトです。'.js'拡張子をつけて保存し、ダブルクリックするかコンソールからCSCRIPT Export.jsなどとして実行します。わざわざ実行速度の遅いJScriptで作っている理由は、単に try{...} catch( e ) {...} でトランザクション処理がしたかったというだけのことです 笑。

MSDE用になっているのは接続文字列だけなので、その部分のみ変更すればOracleやJETなど、ADOで接続可能なDBであれば使用可能だと思います。(でもWSHが利用可能な環境でしか実行できません。)

続きを読む...

December 6, 2003

OLE DB プロバイダ 'MSDAORA.1' のインターフェイスを作成できませんでした

実機セットアップのため、Windows 2000 Serverに、新たにMSDEとOracle Clientをインストールして、MSDEにデータベースを作成し、Oracleのリンクサーバを作成しました。

そして、MSDEから使用するためOracleの表をビューとして作成しようとするとこんなエラーが。

1>SELECT * FROM DB_SVR..USER_FOO.TABLE_BAR
2>GO
メッセージ 7302、レベル 16、状態 1、サーバー TESTSRV、行 1
OLE DB プロバイダ 'MSDAORA.1' のインターフェイスを作成できませんでした。
1>

インターフェースと言う言葉から想像するに、COM回りのエラーであろうと想像は付くのですが(OLE DBってCOMですから)MDACの再インストールを行っても、MSDEの再インストールを行っても解決しませんでした。

一応、
280106 - [HOWTO] SQL Server で Oracle へのリンク サーバーのセットアップおよびトラブルシューティングを行う方法[support.microsoft.com]
に情報がありますが、REGSVR32で確認する前にMDACの再インストールをしたので、あまり有用な情報とは思えませんでした。

だいぶん長いこと試したのですが、結局は、

  1. コントロールパネル→管理ツール→コンポーネント サービス を開く
  2. ツリーの コンポーネント サービス>コンピュータ>マイ コンピュータ を右クリックして、プロパティを表示する
  3. 規定のセキュリティ タブの、規定のアクセス許可 で、規定値の編集 を押下しレジストリ値のアクセス許可 ウインドウを表示する
    ちなみにWindows Xpでは、ここではディレクトリセキュリティを編集するみたいな画面が出てきた記憶があるが、2000系はちょっと違うらしい。
  4. 追加 を押下し、ユーザーとグループの追加 ダイアログでEveryoneを選択して追加を押下し、OKする

で、ビューが作成できるようになりました。Everyoneでなく、MSDEサービスがどのユーザの権限で実行されるのか調べて設定し直さなくてはいけないのですが、それはまたあとで。とりあえず原因は権限不足、だったみたいです。

2003.12.08 追記
SYSTEMアカウントに対し、権限を追加すればOKです。

November 26, 2003

ADOでストアドを使う

ASPで書くのが面倒な処理はDB側でプロシージャにしておくと便利な場合がある。

MSDEでプロシージャを作ってASPから呼び出してみた。

'ASP
Dim adoCmd
Set adoCmd    = Server.CreateObject("ADODB.Command")
With adoCmd
    .CommandText                    = "pCheckValid"
    .CommandType                    = adCmdStoredProc
    Set .ActiveConnection           = adoConGRDB
    .Parameters("@emp_cd")          = strEmpCd
    .Parameters("@require_admin")   = "1"
    Call .Execute()
End With
If Not IsNull(adoCmd.Parameters("@ret_msg")) Then
    Call Response.Write(adoCmd.Parameters("@ret_msg"))
    Set adoCmd    = Nothing
    Exit Sub
End If

ポイントは、CommandText, CommandTypeを設定後にActiveConnectionを設定すること。そうしないと、パラメータがうまくバインドしない。(なんで?)

ちなみに、パラメータにEmptyを渡すとそのパラメータは「省略された」物として扱われる。ASPのCOOKIEやRequest.Formなどの初期値もEmptyなので、その値をパラメータとして渡す場合は、プロシージャ側で初期値を設定しておくのがお勧めである。

※ プロシージャ側でデフォルト値が指定されていないパラメータを省略すると実行時エラーになってしまう。

プロシージャの中身は、こんな感じ(実際に使ったものをいろいろ省略したため変なプロシージャだが)

続きを読む...

November 21, 2003

テーブルを返すFUNCTION

ログイン者が登録されたIPからログインしたときのみレコードを返すFUNCTIONを作ったのですが、結局IPのチェックが仕様から外れたため使わなくなったので、ここに挙げておくことにします。

使用する表はこんな感じ。端末表は、IPとネットマスクを持っていて、マスク後の値と比較します。

社員表 EMP_TBL
COLUMN      TYPE         PRIMARY
----------- ------------ -------
emp_cd      CHAR(6)      TRUE
password    CHAR(12)     
valid_from  CHAR(8)      TRUE
valid_to    CHAR(8)
section_cd  CHAR(7)
admin_flg   CHAR(1)
emp_name    VARCHAR(24)

端末表 EMP_TERM_TBL
COLUMN      TYPE         PRIMARY
----------- ------------ -------
emp_cd      CHAR(6)      TRUE
valid_from  CHAR(8)      TRUE
term_ip     CHAR(15)     TRUE
term_mask   CHAR(15)     TRUE
続きを読む...

November 18, 2003

分散トランザクションを開始できないエラー

Oracleのビューを使用するのように、Oracleのリンクサーバーを作成して、それを使用して更新処理を行う場合に、こんなエラーをよく目にします。

-2147217900(0x80040E14)
Microsoft OLE DB Provider for SQL Server
OLE DB プロバイダ 'MSDAORA.1' は分散トランザクションを開始できなかったので、要求した操作は実行されませんでした。

このエラーが出る要因は、調べた限り、以下のものがありそうです。

  1. MSDTCが起動していない
  2. MtxOCI.dllが読み込めない
  3. トランザクションをネストしている(?)

1は、コントロールパネル>管理ツール>サービスを開き、Distributed Transaction Coordinatorという項目を探して、サービスが開始されているか確認します。

2は、レジストリの設定が正しいかどうか確認します。ちなみにクライアントがOracle9i Enterprise Edition Release 9.2.0.1.0の場合は以下の値で動作しました。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI]
"OracleXaLib"="oraclient9.dll"
"OracleSqlLib"="orasql9.dll"
"OracleOciLib"="oci.dll"

MSDE等には9iに関しての情報がないのですが、インストールされているのはoraclient9.dllなので、まあそれでいいんでしょう。(DLLの名前なんてバージョンごとに変えないでほしいのですが・・・)

Oracleのビューを使用する

OracleのDBサーバとローカルのMSDEを連携しやすくするために、リンクサーバーを使用してビューを作りました。

USE TESTDB
GO
/* リンクサーバーを追加 */
EXEC sp_addlinkedserver
   @server		= 'ORASRV',	/* リンクサーバの参照名。好きにつける。 */
   @srvproduct	= 'Oracle',	/* 固定 */
   @provider	= 'MSDAORA.1',	/* 使用するプロバイダ */
   @datasrc		= 'OraSrv'	/* Netサービス名 */

/* リンクサーバーにログオンできるようにする */
EXEC sp_addlinkedsrvlogin
    @rmtsrvname		= 'ORASRV',	/* さっきつけた参照名 */
    @useself		= 'FALSE',	/* TRUEならSQLServerの認証情報を使用する */
    @locallogin		= 'sa',	/* どのログインで使用するか。NULLなら全ログイン */
    @rmtuser		= 'SCOTT',	/* お約束 */ 
    @rmtpassword	= 'TIGER'	/* これもお約束 */
GO
/* ビューを追加する */
CREATE VIEW EMP AS
SELECT * FROM SPSVR1..SCOTT.EMP
GO

上のように、MSDEからOracleのオブジェクトを指定する場合は、リンクサーバー名..スキーマ.オブジェクト、となります。(要はカタログ部がないのね)

参考

続きを読む...

November 4, 2003

日付を整形する

MSDE/SQL Serverで、VBAのFormat関数、あるいはOracleのTO_CHAR関数のような関数は実装されていませんが、日付を整形するにはCONVERT関数が使用できます。
1> SELECT CONVERT(CHAR(8),GETDATE(),112)
2> go

--------
20031104

(1 件処理されました)

September 17, 2003

ログイン関連のストアドプロシージャ

Transact-SQLリファレンス参照

--ログインの追加
sp_addlogin [ @loginame = ] 'login'
    [ , [ @passwd = ] 'password' ]
    [ , [ @defdb = ] 'database' ]
    [ , [ @deflanguage = ] 'language' ]
    [ , [ @sid = ] sid ]
    [ , [ @encryptopt = ] 'encryption_option' ]
--ログインをDBにアクセス可能にする
sp_grantdbaccess [@loginame =] 'login'
    [,[@name_in_db =] 'name_in_db' [OUTPUT]]
--ログインをロールのメンバに追加する
sp_addrolemember [ @rolename = ] 'role' ,
    [ @membername = ] 'security_account'

September 10, 2003

MSDEで統合Windows認証<->SQLServer認証を切り替える

レジストリを編集することで、変更可能です。

以下を拡張子regで保存して、レジストリに追加するか、
該当キーをレジストリエディタで変更し、MSDEを再起動します。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]
"LoginMode"=dword:00000002

LoginModeの値は、

認証
統合Windows認証 1
SQL Server認証 2
となります。

September 9, 2003

MSDEにSPを適用する

仕事で使用するにあたり、MSDEの環境を作成することになりました。 セキュリティーホールがあるとのことで、SPを適用する段になり、SP3を入手しました。
SP3は2003/9/9現在、ここからダウンロードすることができます。
(jpn_sql2kdesksp3.exe)

続きを読む...