9

制約を使用して特定のテーブルで行の削除を回避する方法はありますか?

ID が 0、1、または 2 の場合、(たとえば) 行の削除を拒否したい

これは、ユーザーがアプリケーションのマスター アカウントを削除するのを避けるためであり、SQL を直接使用して誰かが (誤って) 試みたとしても、それを避けたいと考えています。

ありがとう!

編集:

この質問の全体的な考え方は、アプリケーションに触れないことです。セキュリティの問題ではありません。制約またはSQL Serverが持つその他のことで要求したことを実行できるかどうかを知る必要があるだけです(標準のdbソリューションである必要はありません)。

編集2:

コードサンプルは非常に高く評価されています:D

4

7 に答える 7

10

これを制約で強制する限り、私の解決策は従属テーブルを作成することであるため、参照された行は削除できません。

CREATE TABLE NoKillI (
  id INT NOT NULL, FOREIGN KEY (id) REFERENCES Accounts(id) ON DELETE RESTRICT
);
INSERT INTO NoKillI (id) VALUES (0);
INSERT INTO NoKillI (id) VALUES (1);
INSERT INTO NoKillI (id) VALUES (2);

Accountsで対応する行を最初に削除しない限り、id 値が 0、1、または 2 の行を削除することはできませんNoKillI。SQL 権限を使用して、従属テーブルに対する削除を制限できます。

于 2008-12-14T20:04:12.130 に答える
5

これを行うには、問題のテーブルの DELETE で起動するデータベース トリガーを記述します。ID が無効な場合に例外をスローするだけです。

于 2008-12-14T19:45:40.903 に答える
3

ユーザーを信頼しない場合は、セキュリティを追加してください。

  1. ユーザーが必要な行を削除できるようにするストアド プロシージャを追加しますが、独自のルールに従って必要なものは許可しません。次に、テーブルの削除アクセスを拒否し、sproc への実行アクセスを許可します。
  2. 外部キー参照を含むセカンダリ テーブルを追加し、テーブル MasterAccounts などを呼び出し、このテーブルへの更新/削除アクセスを拒否し、問題のアカウントへの参照を追加します。これにより、アカウントがある限り、誰もアカウントを削除できなくなります。このテーブルからそれへの参照
  3. OrbManが提案するように、トリガーを追加します
  4. 行を削除できるビューを追加し、削除が許可されていないすべてのアカウントをビューにスキップさせ、マスター テーブルへの削除アクセスを拒否し、ビューへの削除アクセスを許可します。

そうは言っても、ユーザーが SQL を介してデータベースと対話するのに十分なアクセス権を持っている場合、実際にはトラブルを求めているだけです。セキュリティを強化し、アプリケーションと確立されたプロトコルを介したデータベースへのアクセスのみを許可する必要があります。次に、このような問題を回避するための多くのオプションがあります。

于 2008-12-14T20:15:21.093 に答える
1

次のトリガーを使用しています。

CREATE TRIGGER [dbo].[mytable_trd] ON [dbo].[mytable]
WITH EXECUTE AS CALLER
INSTEAD OF DELETE
AS
BEGIN
SET NOCOUNT ON
DECLARE @tn varchar(255)
SELECT @tn = object_name(parent_obj)
FROM sysobjects
WHERE id = @@procid;

SET @tn = 'Deletes not allowed for this table: ' + @tn;
-- Add your code for checking the values from deleted
IF EXISTS(select * from deleted where mycolumn = 1)
  RAISERROR (@tn, 16, 1)    
END
GO
于 2008-12-14T22:16:22.660 に答える
0

誰にもこれらの行を削除してほしくないというのは本当ですか? あなた自身、またはデータベース管理者でさえ?または dbms メンテナンス ジョブですか?

一部のユーザーのみの場合は、許可されていないユーザーと許可されているユーザーを区別するためにトリガーでクエリできるように、ユーザー テーブルのようなものが必要になります。

于 2008-12-14T20:55:58.343 に答える
0

私が好むソリューションは、リレーショナル モデルとその整合性ルールを使用します。

Tbl_Account削除できないレコードごとに、外部キーTbl_AccountMasterであるレコードを追加します。データベース管理者以外は更新できません。にリンクされているからのレコードを削除することはできません。Tbl_Account.id_AccountTbl_AccountMasterTbl_AccountTbl_AccountMaster

編集: 同じアイデアがここで開発されていることに気付きました。ビルありがとう!

于 2008-12-14T22:37:28.980 に答える
-1

ユーザーがマスター アカウントを削除しようとしないことを確認する機能を使用して、クエリをフィルタリングしてみてください。

于 2008-12-14T19:36:48.503 に答える