2012年11月8日木曜日

データのインポートがSQL Serverエージェントで実行できない

SQL Server で夜間の内に本番環境からテスト環境にデータをコピーしているんですが、
SQL Serverエージェントのジョブがコケていました。

ジョブの履歴でエラーを確認してみると、
説明: エラー 0x8009000B "指定された状態で使用するには無効なキーです。" により、保護された XML ノード "DTS:Password" の暗号化を解除できませんでした。この情報にアクセスする権限がない可能性があります。

とのこと。

原因は、SQL Server Management Studio の「データのインポート」機能を使ってパッケージを作り、SQL Server上に保存していたんですが、
パッケージの保存時にデータの暗号化がされていたためでした。

暗号化すると何かと面倒なので、ロールでアクセス制御するようにパッケージを作り直しました。


「データのインポート」でパッケージを作成し、保存時に、保護レベルを [アクセス コントロールをサーバー ストレージおよびロールに依存する (Rely on server storage and roles for access control)] に設定します。


[参考URL]
トラブルシューティング : SQL Server エージェントを使用した SSIS パッケージ実行
http://msdn.microsoft.com/ja-jp/library/dd440760(v=sql.100).aspx

暗号化したい人は、SQL Serverエージェントの作成時にパスワードを指定する必要があります。
[参考URL]
SQL Server エージェント ジョブを使用してパッケージを実行する方法
http://msdn.microsoft.com/ja-jp/library/ms139805(v=sql.90).aspx


SQL Server 2000のときは何も考えずにできたんですけどね。
世知辛い世の中です。

2012年10月24日水曜日

Analysis Serviceのリレーションシップ設計

最近SQL ServerのAnalysis Services の構築を試みてます。

一応、「徹底検証 SQL Server 2008 データウェアハウス環境構築」という本を片手にやってますが、いかんせん分からないことが多すぎる。

まあ多次元データベースに関する知識がこれっぽっちもないので仕方ないのかもしれませんが・・・

今日引っかかったのは複合キーによるテーブル結合。

ずばり、、できないらしいです。

説明しますと、ファクトテーブルを中心にディメンションテーブル(通常はマスタの類)を結合してきますが、この時にディメンションテーブルの主キーが複合キー(複数列からなる主キー)だとうまくデータが取れません。

この場合は、複合キーを結合やらなにやらで1つの論理主キー列を作成して、その列でリレーションを張る必要があります。


細かいことはMSDNで。
http://msdn.microsoft.com/ja-jp/library/gg492102.aspx


4時間くらい悩んだ…


2012年9月12日水曜日

UPDATEでSELECT文

Microsoft SQL Server で、SELECT文の結果で、UPDATEをかけたい場合

UPDATEでSELECT文を書きたい場合、方法はいくつかあるが自分が便利だと思うものを。


例)テーブルB で、テーブルAの列を更新したい場合
UPDATE テーブルA
SET 列1 = B.列2
FROM テーブルA A
 INNER JOIN テーブルB B ON A.キー1 = B.キー1
WHERE A.列 = [更新対象の条件]

この構文の便利なところは、SELECT文のSQLの結果を事前に確認できるところ。

上記のSQLのFROM句以下はそのままで、
SELECT *
FROM テーブルA A
 INNER JOIN テーブルB B ON A.キー1 = B.キー1
WHERE A.列 = [更新対象の条件]

とすると、更新対象のレコードと、更新する値を事前に確認できる。

これで全レコード書き換えちゃったみたいなミスもなくなりますね。

2012年9月5日水曜日

はじまり

SEをやっていると色々なトラブルに巻き込まれたり、顧客の無茶な要望にさらされたりします。

そんな時の情報収集に、Webはかかせません。

いつもお世話になっているのでたまには自分も人の役に立てればと思い、
せめて遭遇したトラブルの解決法でも乗せてみようかと思います。