以前に 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 セキュリティ構成] を起動して、[サービスと接続のセキュリティ構成] より、リモート接続を有効にする必要があるみたいです。
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のドキュメントがあります。
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のデータを手軽にExport/ImportするWSHスクリプトです。'.js'拡張子をつけて保存し、ダブルクリックするかコンソールからCSCRIPT Export.jsなどとして実行します。わざわざ実行速度の遅いJScriptで作っている理由は、単に try{...} catch( e ) {...} でトランザクション処理がしたかったというだけのことです 笑。
MSDE用になっているのは接続文字列だけなので、その部分のみ変更すればOracleやJETなど、ADOで接続可能なDBであれば使用可能だと思います。(でもWSHが利用可能な環境でしか実行できません。)
実機セットアップのため、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の再インストールをしたので、あまり有用な情報とは思えませんでした。
だいぶん長いこと試したのですが、結局は、
で、ビューが作成できるようになりました。Everyoneでなく、MSDEサービスがどのユーザの権限で実行されるのか調べて設定し直さなくてはいけないのですが、それはまたあとで。とりあえず原因は権限不足、だったみたいです。
2003.12.08 追記
SYSTEMアカウントに対し、権限を追加すればOKです。
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なので、その値をパラメータとして渡す場合は、プロシージャ側で初期値を設定しておくのがお勧めである。
※ プロシージャ側でデフォルト値が指定されていないパラメータを省略すると実行時エラーになってしまう。
プロシージャの中身は、こんな感じ(実際に使ったものをいろいろ省略したため変なプロシージャだが)
ログイン者が登録された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
Oracleのビューを使用するのように、Oracleのリンクサーバーを作成して、それを使用して更新処理を行う場合に、こんなエラーをよく目にします。
-2147217900(0x80040E14)このエラーが出る要因は、調べた限り、以下のものがありそうです。
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の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のオブジェクトを指定する場合は、リンクサーバー名..スキーマ.オブジェクト、となります。(要はカタログ部がないのね)
1> SELECT CONVERT(CHAR(8),GETDATE(),112)
2> go
--------
20031104
(1 件処理されました)
--ログインの追加 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'
レジストリを編集することで、変更可能です。
以下を拡張子regで保存して、レジストリに追加するか、
該当キーをレジストリエディタで変更し、MSDEを再起動します。
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer] "LoginMode"=dword:00000002
LoginModeの値は、
| 認証 | 値 |
|---|---|
| 統合Windows認証 | 1 |
| SQL Server認証 | 2 |