none
MDX DBディメンションを取得したい RRS feed

  • 質問

  • お世話になります。

    データベースディメンションをMDXで取得することは可能でしょうか。
    ロール設定済みのデータベースディメンションから値の一覧を取得したいです。

    select ・・・ from キューブ名 で
    キューブディメンションは取得できるのですが。。。

    ロール設定の画面では、データベースディメンションと
    キューブディメンションが分かれているので可能だと思うのですが。

    2010年3月11日 7:40

回答

  • 権限設定で解決する方法は分かりません...

    BIDSのロールの設定で、ディメンションタブのアクセスの列(選択肢が「読み取り」「読み取りと書き込み」のところ)で、いったん「読み取りと書き込み」にすると、(ロールの設定ファイルではなく)ディメンションの設定ファイルが書き換わりました。
    ディメンションをコード表示した際の該当箇所です↓。

      <DimensionPermissions>
        <DimensionPermission dwd:design-time-name="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
          <ID>DimensionPermission</ID>
          <Name>DimensionPermission</Name>
          <CreatedTimestamp>0001-01-01T00:00:00Z</CreatedTimestamp>
          <LastSchemaUpdate>0001-01-01T00:00:00Z</LastSchemaUpdate>
          <RoleID>Role</RoleID>
          <Process>true</Process>
          <Read>Allowed</Read>
          <Write>Allowed</Write>
        </DimensionPermission>
      </DimensionPermissions>

    このあと、「読み取り」に戻してロールを保存すると、<Write>Allowed</Write> が除去されます。
    この<DimensionPermissions>要素は、いったん「読み取りと書き込み」に変えて保存しないと書き込まれないようなのです...

    私の環境ではアカウントを変えたテストがやりずらいためここまでしか出来ませんが、上記の手順で<DimensionPermissions>要素、<Read>Allowed</Read>を指定された状態でディメンションが配置されたときに振る舞いが変わるか知りたいです。



    それと、別アイデアで、ダミーの(ディメンションメンバを制限しない)キューブを介して取得するアイデアはどうでしょうか。

    • 回答としてマーク pomodoro 2010年3月15日 14:57
    2010年3月12日 10:13

すべての返信

  • ニーズを満たしているかどうか分かりませんが、このあたりはどうでしょうか。

    SELECT * FROM [$SYSTEM].[MDSCHEMA_MEASUREGROUP_DIMENSIONS]
    SELECT * FROM [$SYSTEM].[MDSCHEMA_DIMENSIONS]

    スキーマ行セット
    http://msdn.microsoft.com/ja-jp/library/ms126233.aspx
    ※このうちの多くは SSAS2008 以降で有効です。

    ただ...用語の使い方からSSAS2000 なのではないかと思われるのですが、バージョンは何でしょうか。
    2010年3月11日 8:59
  • nagasakitさん、返信ありがとうございます。

    SSASは2008です。
    ご教示頂いた方法で、Dimension一覧を取得できました。色々使えそうです。


    次に、データベースディメンションを取得は可能でしょうか。

    まず、ロールに関してですが、基本的にはデータベースディメンションの設定を
    キューブディメンションに継承しますが、継承しない(一部変更する)こともあります。


    で、
    キューブディメンションの場合は以下で取得できますが、
     ------------------------------------------------
     select  {} on 0,
               [次元名].[階層名].members on 1
     from  [キューブ名]
     ------------------------------------------------
    この場合、キューブディメンションに設定されたロールが反映された結果となります。


    そうではなく、以下のような形で、
     ------------------------------------------------
     select  {} on 0,
               [次元名].[階層名].members on 1
     from  [SSASのDB名]
     ------------------------------------------------
    (キューブディメンションの元となる、)
    データベースディメンションに設定されたロールが反映された結果を取得したいです。


    2010年3月12日 0:36
  • すいません、理解できました。
    ディメンションメンバの一覧を得たいのですね。
    これではどうでしょうか。「$」に注意してください。

     ------------------------------------------------
     select  {} on 0,
               [次元名].[階層名].members on 1
     from  [$次元名]
     ------------------------------------------------

    管理ツールや開発ツールで実現できていることについて、具体的なクエリの内容を調べるには、
    SQL Server Profiler を使うとよいです。

    • 編集済み nagasakit 2010年3月12日 3:06 誤り
    2010年3月12日 3:04
  • nagasakitさん、返信ありがとうございます。

    ご教示頂いた方法でディメンションメンバの一覧を取得できたのですが、
    別の問題がでてきました。
    ロール設定で、「フルコントロール(管理者)」権限の人は、この方法で
    取得できたのですが、この権限がない場合は取得出来ないようです。

    そもそも、フルコントロールを外すと、SSMSのオブジェクトエクスプローラで、
    データベースディメンションの右クリックで参照ができません。

    ロールを色々触ったのですが、フルコントロールを付ける以外に
    データベースディメンションの右クリックで参照ができないようなのです。

    ちなみに、キューブ(とキューブディメンション)はちゃんと
    ロール設定どおりにメンバが取得できます。

    何かロールの設定、あるいは別の設定が必要なのでしょうか、
    2010年3月12日 8:46
  • 権限設定で解決する方法は分かりません...

    BIDSのロールの設定で、ディメンションタブのアクセスの列(選択肢が「読み取り」「読み取りと書き込み」のところ)で、いったん「読み取りと書き込み」にすると、(ロールの設定ファイルではなく)ディメンションの設定ファイルが書き換わりました。
    ディメンションをコード表示した際の該当箇所です↓。

      <DimensionPermissions>
        <DimensionPermission dwd:design-time-name="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
          <ID>DimensionPermission</ID>
          <Name>DimensionPermission</Name>
          <CreatedTimestamp>0001-01-01T00:00:00Z</CreatedTimestamp>
          <LastSchemaUpdate>0001-01-01T00:00:00Z</LastSchemaUpdate>
          <RoleID>Role</RoleID>
          <Process>true</Process>
          <Read>Allowed</Read>
          <Write>Allowed</Write>
        </DimensionPermission>
      </DimensionPermissions>

    このあと、「読み取り」に戻してロールを保存すると、<Write>Allowed</Write> が除去されます。
    この<DimensionPermissions>要素は、いったん「読み取りと書き込み」に変えて保存しないと書き込まれないようなのです...

    私の環境ではアカウントを変えたテストがやりずらいためここまでしか出来ませんが、上記の手順で<DimensionPermissions>要素、<Read>Allowed</Read>を指定された状態でディメンションが配置されたときに振る舞いが変わるか知りたいです。



    それと、別アイデアで、ダミーの(ディメンションメンバを制限しない)キューブを介して取得するアイデアはどうでしょうか。

    • 回答としてマーク pomodoro 2010年3月15日 14:57
    2010年3月12日 10:13
  • nagasakitさん、返信ありがとうございます。

    <DimensionPermissions>要素、<Read>Allowed</Read>を指定された状態で
    ディメンションが配置されたときに振る舞いが変わるか知りたいです。


    ロールを一から作成してやってみました。
    BIDSでロール設定&配置、SSMSで参照の確認です。
    (別途、SSMSでロールを直接変更&参照の確認をしましたが、結果は同じでした)


    初期
    DB一覧に該当DBが見えない

    ディメンションタブ「読み取りと書き込み」設定後
    <Read>Allowed</Read>
    <Write>Allowed</Write>
    となる。
    DB一覧に該当DBが見える。ディメンション右クリック参照でエラー。

    ディメンションタブ「読み取り」に変更後
    <Read>Allowed</Read>
    となる。
    DB一覧に該当DBが見える。ディメンション右クリック参照でエラー。

    ディメンションデータタブ、DBディメンションにメンバフィルタ設定後
    (CUBEディメンションのフィルタはDBDIMを継承(何も触らない)
    DB一覧に該当DBが見える。ディメンション右クリック参照でエラー。
    CUBE右クリック参照で、継承しているCUBEディメンションは
    フィルタされて表示。


    設定ミスか不具合かはわかりませんが、DBディメンション(ロール付き)は見たいです。

    別アイデアで、ダミーの(ディメンションメンバを制限しない)キューブを介して取得するアイデア
    現実解として、これでいくしかなさそうです。。。




    以下想像です。
    もしかしたら、そもそもDBディメンション(ロール付き)だけをユーザに提供する気が
    ない(必要ない想定?)のかな、と思いました。
    というのは、CUBEディメンションの場合は、SSMSで、ロールを切り替えて表示が
    できますが、DBディメンションはその機能がない、
    ロール設定画面でよく見られる、継承という言葉からも、
    DBディメンションはCUBEディメンションの継承元としての役割しかない、
    (純粋仮想関数という言葉が思い浮かびました)
    ユーザはCUBEを見るのでCUBEディメンションが見えればいいでしょ、のような。


    • 編集済み pomodoro 2010年3月15日 14:47 修正
    2010年3月15日 2:11
  • お手数おかけしました。

    ディメンションの設定ファイルで<DimensionPermissions>要素の<Read>Allowed</Read>が正しく指定されていたら
    読み取れる、のであれば理解可能だったのですが、どうやら直感的理解とは異なる仕様のようですね。


    >ユーザはCUBEを見るのでCUBEディメンションが見えればいいでしょ、のような。

    そうなのかもしれませんね。
    解決できず申し訳ありません。
    2010年3月15日 6:19
  • nagasakitさん、返信ありがとうございました。

    色々と有益な情報を頂き、理解が深まりました。
    ありがとうございました。


    最近、ユーザに近くなったと感じるMS社様、
    DBディメンション(ロール付き)は見たいです」
    とつぶやいておきます。。。
    2010年3月15日 14:57