• ベストアンサー

あるテーブルのデータを追加、更新、削除できないようにするには?

SQLServer2000 あるテーブルのデータを追加、更新、削除できないようにするにはどのようにしたらいいでしょうか。 どなたかご存知の方、お教え下さい

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

#1です。 ユーザ名がdboって、要はsaアカウントに対して制限を掛けようとしているということですか? 基本的にsysadminを持っている人は「何でもできる人」ですから、発想的に無理がありますよ。その点は認識してください。 (方法1) SQL Serverはテーブル単位に読み取り専用にする機能がありませんので、 ・ファイルグループを新設し(SECONDARYなど)、そこにデータファイルを追加します。 ・新設したファイルグループに、対象テーブルを新規に作成し、そこにデータを移します。  (テーブル自体を「移動」することはできないと思います) ・新設したファイルグループを読み取り専用にします。 基本的には全部GUIでできます。 上記の通り、テーブルの再作成ができることが条件で、これをやるとファイルグループの属性を変更しない限り、「例外なく」誰も更新できません。ただ、sysadmin権限を持っている人がファイルグループの属性を変更しようとしても、阻止できません。 (方法2) 条件付きですし、ちょっと姑息なのでおまけです。 INSTEAD OFトリガは、更新処理自体は行わないため、トリガ内で更新処理を書かないと何もしません。 (RAISERRORも書かなければ、実行したときにあたかもうまくいったように見えます) CREATE TRIGGER tr_(テーブル名) ON dbo.(テーブル名) INSTEAD OF INSERT,UPDATE,DELETE AS BEGIN SET NOCOUNT ON RAISERROR('Insert/Update/Delete is not allowed',16,1) END ただし、この方法は制限を掛けたいユーザがトリガをオフにする方法を知っているとアウトです。 ユーザがトリガをオフにする方法を知っている場合は、それを阻止する方法はありません。

teburon
質問者

お礼

丁寧に教えていただきありがとうございます。 今までこのようなことを想定せずにSQLServer+アクセスプロジェクトで小規模システムを作ってきましたが、大変参考になりました。 次のシステムを作る時に参考にしたいと思います。 ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

ロールを利用したグループ単位での権限設定 http://www.atmarkit.co.jp/fnetwork/rensai/sql18/sql1.html

teburon
質問者

お礼

ご回答ありがとうございます。 大変参考になりました

全文を見る
すると、全ての回答が全文表示されます。
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

対象のユーザがsysadmin権限を持っていないことが条件です。 DENY INSERT,UPDATE,DELETE ON (テーブル名) TO (ユーザ名)

teburon
質問者

補足

早速のご教授ありがとうございます。 ご教授いただいた記述をユーザー名であるdboに対して実行しましたが、 反映されませんでした。 おそらくご指摘のようにdboにはsysadmin権限があるせいだと思います。 当方のシステムのユーザーはdboしかなく、新たにユーザーを作るのはかなり大変のように思います。 そこでお尋ねしたいのですが、ユーザーがdboであってもデータの追加、変更、削除ができないようにする方法はないのでしょうか

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • マスタデータ更新

    こんにちは。 システム開発の基礎的なところがわからないので、教えていただきたく、投稿させていただきます。 システム開発をほとんどやったことがないので、言葉が変なところもあるかと思いますが、宜しくお願いいたします。 サーバー上に、AというSQLServerのDBがあります。 今までは、システム管理者のみがAccessからA.DBのリンクテーブルを使い、マスタデータの更新/追加/削除を行っていましたが、今後、リーダークラスの人もできるようにしたい!という要望があり、そのインターフェース部分を作成しています。 いろいろと考え、フロントエンド側にAccessでB.mdbを作成し、そこには、A.DBと同じテーブル構造の一時TBLを作成し、B.mdbを開いた時にA.DBから全データを取得することにしました。(取得するところまではできています) ここから、設定するための画面作成をしますが、最終的に、更新/追加/削除されたデータは、どのようにA.DBにUPすればいいのでしょうか? 考えた方法として (1)B.mdb内に、一時テーブルとは別に、更に同じ構造の変更用テーブルを作成。 設定画面から更新/追加/削除されたデータは変更用テーブルに保存し、全ての処理が終了したら、変更用テーブルにあるデータを1つづつ見て、A.DBへ更新/追加/削除をかける (2)一時テーブルのデータを直接更新/追加/削除し、全ての処理が終了したら、全テーブルのレコードを1件づつ比較し、A.DBへ更新/追加/削除をかける というくらいしか思いつかないのです。 その他に思ったのが、一時テーブルもしくは変更用のテーブルに、レコード毎に「更新/追加/削除」がわかるようにフラグを設けて、そのフラグに従ったSQL文を発行する というくらいです。。。 根本的に、マスタデータに対する更新/追加/削除のやり方が間違っていたりしますか? 誰も聞ける人がいないので、どうぞ宜しくお願いいたします!!!

  • テーブルのレコード削除ができません

    SQLserver2000を触る事になり思った通りにならず困っております。 テーブルに主キーを設定せずデータ型を「int」でフィールドに重複する数値を入れてしまいました。 後から重複入力のミスに気づき重複したレコードを 「テーブルを開く」-「全行を返す」から1レコードを 削除しようとしたのですが、 「キー列の情報が足りないか、正しくありません。更新の影響を受ける行が多すぎます。」と表示され削除できません。 このテーブルは、多くのビューで使用してすでに動いている再作成することは難しいです。 このレコードを削除する良い方法はあるのでしょうか。 ご存知の先生方ご指導よろしくお願いいたします。

  • テーブルの削除について

    DoCmd.OpenQuery "更新"でテーブルAを更新クエリを実行データBの データを更新してから DoCmd.DeleteObject acTable, "データB" でテーブルを削除するとエラーで削除できません どの様にすねれば削除できるでしょうか アクセス2003 XP の環境です よろしくお願いします

  • 伝票入力のデータ更新方法について

    Accessで日毎の商品の製造入力を考えていますが、この入力を複数のパソコンで入力可能にしたいです。 画面は、 日付 2022/7/1 行 商品コード 製造数量 1 1001   10 2 1002   20 3 1003   30 「登録」 「削除」 のような感じです ちなみに、今までの作り方は、日付が入力されたら7/1の製造テーブルから明細をワークテーブルに入れて、画面で追加や変更をします。データ更新の時に、製造データの7/1のデータを削除して、追加や変更されたワークテーブルを製造テーブルにINSERTしてました。 ただ、これは他のパソコンで同時に7/1の製造入力が行われたら、他のパソコンで追加等のされたものが反映しないので、どのような方法で更新すれば良いですか? ただ、7/1の製造テーブルが他のPC使用中です!で止めたくはないです データベースはSQLSERVERを使います 宜しくお願い致します

  • リモートのmdbファイルのテーブルを追加したりできるツール

    リモートのmdbファイルのテーブルを追加したりできるツールをご存じありませんか? テーブルの作成、削除、フィールドの追加、削除、更新などがリモートのサーバー上のmdbに対してできると便利なのですが。

  • Excelピボットテーブルのデータ更新について

    元のリストのデータを変更して、「データの更新」ボタンをクリックすると変更が反映され、ピボットテーブルも更新されますよね。 ところが、元のリストの下にデータを追加していった場合はピボットテーブルに反映されません。。。 これはその都度ピボットテーブルのリスト範囲を選択しなおして訂正するという方法をとるしかないのでしょうか。 最初からリスト範囲を広めにとると、テーブルに空白ができてしまいます、何か方法があるのでしょうか?

  • フォームの追加・削除・更新をしない方法

    追加の許可 削除の許可 更新の許可 を一気に「いいえ」に出来る方法があったような気が・・・ アクセスのフォーム表示するデータの追加も削除も更新もしたくないので この3つを全て「いいえ」にすればいいのですが、 「ロック」みたいなプロパティってありませんでしたっけ? 3つをいじるのではなく、一つだけのプロパティをいじれば、全ていいえにできるのならそっちを使いたいです。 当方2007を使用しております。

  • アクセスで、テーブルのデータが更新できない

    アクセスで、テーブルのデータが更新できない accessについての質問なのですが、テーブルの中のデータを(フォーム等を使わず)テーブルを開いて直接データを書き換えました。 フィールド名などの変更でなく、テーブルの中身の更新です。 そのあと、数日間はその変更された内容が保持されていたのですが、1週間もたたないうちに、またもとに戻っていたのです。(3回以上、同じことがありました) これは何か原因があるのでしょうか。それとも、このaccess自体が何かおかしくなっているのでしょうか??

  • 更新クエリでテーブルを書き換えたい

    データが0件のテーブルに、更新クエリで一つのレコードを追加したいのですが そもそもテーブルにデータが入ってない状態だから更新すらできないのですが こういう時どうすればいいでしょうか? Ttest01テーブルにaを入れたい場合、 UPDATE Ttest01 SET Ttest01.test01 = "a"; これだとうまくできません。 Ttest01のtest01フィールドの1行目にaを入れる方法を教えてください。

  • ACCESS2000 クエリーを開いてテーブルのデータを更新したい

    ウィンドウズ98,ACCESS2000です。 二つのテーブルがあって、リレーションがあります。 これを元にクエリーを作成して、クエリーを表示させたフォームでデータの更新や削除を行いたいと思っております。 が、実際やろうとするとこのレコードセットは更新できませんとでます。 何か考えられる理由はありますか? よろしくお願いします。