現在はアクセス制限していないAccessからのODBC接続による処理が多数あるのですが、セキュリティの観点から同一SQLを実行した場合でもユーザにより表示される項目を抑制したいと思っています。
重要情報のカラムは、管理者はデータ値で見えるけど、一般ユーザは「表示不可」とかにしたいです。(具体的には下記イメージ)
これを実現する上で、既存のAccessに手を加えることなく実現できる方法は無いかを探しています。

テーブル:TBL01(所有者:u01)に、「氏名」と「口座番号」のカラムがあるとし、
Select * from TBL01;を実行した場合、
<管理者>        <一般ユーザ>
氏名 口座番号      氏名 口座番号
-- ----      -- ----
A氏 12345678      A氏 表示不可
B氏 99999999      B氏 表示不可
となるようにしたい

所有者u02,u03で夫々以下の様なViewを作り、実行ユーザにViewのSelect権限を与えれば出来るかと考えました。
u02で:
create view u02.TBL01 (氏名,口座番号) as select * from u01.TBL01;
u03で:
create view u03.TBL01 (氏名,口座番号) as select 氏名,'表示不可' from u01.TBL01;
Viewのselect権限付与:
管理者(u04)と一般ユーザ(u05)に対して
grant select on u02.TBL01 to u04;
grant select on u03.TBL01 to u05;
とすれば、上手くいくのではないかと考えていました。

しかしAccessからのODBC接続の場合、'所有者'.'オブジェクト'(例にそうとu01.TBL01)という形でSQLが格納される様なので、上記の方法では実現できません。

違った視点から、カラムの暗号化が使えないか?とか、一般ユーザのselect権限にカラム指定をしてアクセス不可のカラムを外すとかも考えましたが、出来そうもありませんでした。

面倒な質問で申し訳ございませんが、良い案をご教授いただければ助かります。

A 回答 (1件)

Oracle10gなら、VPD(仮想プライベートデータベース)で実現できそうな


気がします。詳しくはマニュアルを参照下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
現在のVersionは9iですが、Version Upの予定もありますのでVPDを調べて見ます。

お礼日時:2007/08/30 10:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aと関連する良く見られている質問

Qdate '0001-01-01'からの日数

Oracle XEとC#4とでは、0001/1/1からの日数に少し差があるみたいなんです。何ででしょうか?

Oracle
> select '0101' n, date '0101-01-01' - date '0001-01-01' m from dual
> union all select '0201' n, date '0201-01-01' - date '0001-01-01' m from dual
> ~
> union all select '2001' n, date '2001-01-01' - date '0001-01-01' m from dual
> union all select '2010' n, date '2010-01-01' - date '0001-01-01' m from dual

C#
> static void Main(string[] args) {
>   DateTime z = new DateTime(0, DateTimeKind.Utc);
>   foreach (int i in new int[] { 101, 201, 301, 401, 501, 601, 701, 801, 901, 1001,
>     1101, 1201, 1301, 1401, 1501, 1601, 1701, 1801, 1901, 1970, 2001, 2010, }) {
>     TimeSpan s = new DateTime(i, 01, 01, 0, 0, 0, DateTimeKind.Utc) - z;
>     Console.WriteLine("{0:0000}{1, 10}", i, s.TotalDays);
>   }
>   Console.ReadLine();
> }

| | C# | Oracle | 差 |
| 0101/01/01 | 36,524 | 36,525 | -1 |
| 0201/01/01 | 73,048 | 73,050 | -2 |
| 0301/01/01 | 109,572 | 109,575 | -3 |
| 0401/01/01 | 146,097 | 146,100 | -3 |
| 0501/01/01 | 182,621 | 182,625 | -4 |
| 0601/01/01 | 219,145 | 219,150 | -5 |
| 0701/01/01 | 255,669 | 255,675 | -6 |
| 0801/01/01 | 292,194 | 292,200 | -6 |
| 0901/01/01 | 328,718 | 328,725 | -7 |
| 1001/01/01 | 365,242 | 365,250 | -8 |
| 1101/01/01 | 401,766 | 401,775 | -9 |
| 1201/01/01 | 438,291 | 438,300 | -9 |
| 1301/01/01 | 474,815 | 474,825 | -10 |
| 1401/01/01 | 511,339 | 511,350 | -11 |
| 1501/01/01 | 547,863 | 547,875 | -12 |
| 1601/01/01 | 584,388 | 584,390 | -2 |
| 1701/01/01 | 620,912 | 620,914 | -2 |
| 1801/01/01 | 657,436 | 657,438 | -2 |
| 1901/01/01 | 693,960 | 693,962 | -2 |
| 1970/01/01 | 719,162 | 719,164 | -2 |
| 2001/01/01 | 730,485 | 730,487 | -2 |
| 2010/01/01 | 733,772 | 733,774 | -2 |

もしかして、どこか間違ってますか?

Oracle XEとC#4とでは、0001/1/1からの日数に少し差があるみたいなんです。何ででしょうか?

Oracle
> select '0101' n, date '0101-01-01' - date '0001-01-01' m from dual
> union all select '0201' n, date '0201-01-01' - date '0001-01-01' m from dual
> ~
> union all select '2001' n, date '2001-01-01' - date '0001-01-01' m from dual
> union all select '2010' n, date '2010-01-01' - date '0001-01-01' m from dual

C#
> static void Main(string[] args) {
>   DateTime z = new DateTime...続きを読む

Aベストアンサー

多分、グレゴリオ暦の扱いが違うんだと思います。
・Ruby
require 'date'
hoge = Date.new(2010,12,1)
piyo = Date.new(1,1,1.)
puts (hoge-piyo).to_i
→ 734108
hoge = Date.new(2010,12,1)
piyo = hoge = Date.new(1582,10,15) #グレゴリオ暦開始日
puts (hoge-piyo).to_i
→156371
・Python
import datetime
hoge = datetime.datetime(2010,12,1)
piyo = datetime.datetime(1,1,1)
print hoge - piyo
→734106
hoge = datetime.datetime(2010,12,1)
piyo = datetime.datetime(1582,10,15)
print hoge - piyo
→156371
・Oracle
select to_date('2010-12-01','yy-mm-dd') - to_date('0001-01-01','yyyy-mm-dd') from dual
→734108
select to_date('2010-12-01','yy-mm-dd') - to_date('1582-10-15','yyyy-mm-dd') from dual
→156371

多分、グレゴリオ暦の扱いが違うんだと思います。
・Ruby
require 'date'
hoge = Date.new(2010,12,1)
piyo = Date.new(1,1,1.)
puts (hoge-piyo).to_i
→ 734108
hoge = Date.new(2010,12,1)
piyo = hoge = Date.new(1582,10,15) #グレゴリオ暦開始日
puts (hoge-piyo).to_i
→156371
・Python
import datetime
hoge = datetime.datetime(2010,12,1)
piyo = datetime.datetime(1,1,1)
print hoge - piyo
→734106
hoge = datetime.datetime(2010,12,1)
piyo = datetime.datetime(1582,10,15)
print hoge - piyo
→1...続きを読む

QViewのカラムの長さが不明?

はじめまして。Viewについての質問です。

とあるViewを作成し、Number型のカラムの長さを調べた所なにも表示されておらず、わからない状態になってしまいました。
元のTableのNumber型のカラムには(10,0)がセットされており同じTableを参照している別のViewには正しく(10,0)と表示されています。

カラムの長さが表示されないViewは分析関数、インラインビュー、UNIONなどを使用しているのでそれらが邪魔をしてカラムが取得できないようになってしまったのでしょうか?

こう言ったケースは初めてなので分かる方いらっしゃいましたら教えてください。

以上です。よろしくお願いします。

Aベストアンサー

NUMBER型のスケール(精度)については、不明になります。

例えば、SCOTT.EMPのEMPNOは、NUMBER(4)ですが、
CREATE VIEW V_EMP(EMPNO) AS SELECT EMPNO+0 FROM EMP;
としただけで、V_EMPのEMPNOは、桁数不明です。
(オラクルの属性追跡の限界なんでしょう)

Qselectの内容によって、登録するカラムを変えたい

selectの内容によって、登録するカラムを変えたい

selectであるテーブルからある値Aをとってきます。
値Aが1の時は別テーブルの金額1に登録、2の時は金額2に登録、3の時は金額3に登録
という処理を行いたいです。
同一レコードに対して複数の金額がある事があります。

テーブル1(取得テーブル)
------------------
キー 値A 金額
1   1  500
1   3  300
2   3  200
------------------

テーブル2(登録テーブル)
------------------
キー 金額1 金額2 金額3
1   500  0  300
2    0  0  200
------------------

いま、
insert into テーブル2 SELECT 項目 from テーブル1
というように1つのSQLで、登録、削除をしようとしていますが
可能でしょうか?。方法がよく分かりません。

Aベストアンサー

テーブル1のレコードが、キーと値Aで一意である前提ですが

insert into テーブル2
select キー,金額1,金額2,金額3
from
(select
キー,
max(case when 値A = 1 then 金額 else 0 end) 金額1,
max(case when 値A = 2 then 金額 else 0 end) 金額2,
max(case when 値A = 3 then 金額 else 0 end) 金額3
from テーブル1
group by キー);

ではどうでしょう?

QORA-00959: 表領域'****'は存在しません

いつもお世話になっております。
既存のSQLスクリプトを流してテーブルを作成しようとしているのですが、
ORA-00959: 表領域'TS_TB_DATA_1M'は存在しません
というエラーが出てしまいます。
スクリプトの内容は以下の通りです。
CREATE TABLE tb_mstcom_111 (
trhksk_cdCHAR (6),
         ・
         ・
        途中省略
         ・
         ・ 
sishkshnprg_cdVARCHAR2 (30),
skj_flgCHAR (1),
CONSTRAINT tb_mstcom_111 PRIMARY KEY (trhksk_cd) USING INDEX TABLESPACE ts_ix_data_1m
)
TABLESPACE ts_tb_data_1m;

単純なクリエイト文等しか経験したことが無い為、サイトを検索して調べてはみたのですが、初心者の私にはどれも??な感じで困っています。
どなたか原因がわかる方ご教授お願い致します。

いつもお世話になっております。
既存のSQLスクリプトを流してテーブルを作成しようとしているのですが、
ORA-00959: 表領域'TS_TB_DATA_1M'は存在しません
というエラーが出てしまいます。
スクリプトの内容は以下の通りです。
CREATE TABLE tb_mstcom_111 (
trhksk_cdCHAR (6),
         ・
         ・
        途中省略
         ・
         ・ 
sishkshnprg_cdVARCHAR2 (30),
skj_flgCHAR (1),
CONSTRAINT tb_mstcom_111 PRIMARY KEY (trhksk_c...続きを読む

Aベストアンサー

エラーの通り、表領域がないためです。
ORACLEのテーブルはすべて表領域に作られます。
ですのでテーブルを作る前に表領域tb_mstcom_111を先に作成するか、上記のtb_mstcom_111の部分を存在する表領域に変更すればいいと思います。
表領域の作成はCREATE TABLESPACEで可能です。

QOracle10.2インストール後、インストールOSのユーザでない他のユーザからSQLPLUSを使うには?

Oracle10.2をRed hat Linux ES4にインストールしました。
インストール後、環境変数(NLS_LANG、ORACLE_HOME等)を
設定し、SQLPLUSを実行しました。
インストールしたOSのユーザ(oracle)でない
他のOSユーザから(user1)からSQLPLUSを実行をしようとすると
実行ができません。この問題は、実行ファイル等に
読み取り、実行権限(rx)ないということまでわかりました。
インストールしたユーザのグループに追加してもSQLPLUSを
使うことはできませんでした。
通常、インストールしたユーザ以外のユーザからSQLPLUS
(exp、imp等 $ORACLE_HOME/binにある実行ファイル)を
使うにはどのように設定すればよいのでしょうか??

Aベストアンサー

10.2.0.1を素でインストールすると、パーミッションの設定が
他ユーザは使用できないような設定になってます。

パッチ(10.2.0.2以降)を適用してますか?
パッチについては話せないのでサポートに確認してください。

※ヒント「changePerm.sh」


おすすめ情報