特定の列の更新を制限します。ストアドプロシージャによるこれらの列の更新のみを許可する


17

ストアドプロシージャを通じてのみ更新したい繊細な価格列があります。更新するように設計されたストアドプロシージャを使用していない場合、すべてのコードまたは手動でこれらの価格列の値を変更しようとすると失敗します。

トリガーとトークンテーブルを使用してこれを実装することを検討しています。私が考えているアイデアは、トークンテーブルを持つことです。ストアドプロシージャは、最初にトークンテーブルに値を挿入する必要があります。次に、価格列を更新します。更新トリガーは、更新された行のトークンテーブルにトークンが存在するかどうかを確認します。見つかった場合、続行します。トークンが見つからない場合、例外をスローし、更新トランザクションを失敗させます。

この制限を実装する良い/より良い方法はありますか?


1
列ベースのセキュリティのビューを使用できます。それはトリガーよりもはるかにエレガントです。ビューに対する権限をユーザーに与えますが、基礎となるデータは与えません。
トーマスストリンガー

それは良い点です。ただし、接続プーリングを使用している多くのアプリケーションを中断することなく、問題は未解決のままです。
エリアス

これが「接続プーリングを使用している多くのアプリケーションを破壊する」ことをどのように説明できますか?
アーロンバートランド

回答:


21

SQL Serverでは、列レベルの権限が許可されています。ちょうど例:

GRANT UPDATE ON dbo.Person (FirstName, LastName) TO SampleRole;
DENY UPDATE ON dbo.Person (Age, Salary) TO SampleRole;

Michalに感謝しますが、私のアプリケーションは接続プーリングを使用しているWebアプリケーションであるため、このソリューションは機能しません。すべてのユーザーが同じSQL Server接続文字列を使用して接続します。
エリアス

1
@Eliasわかりません。接続文字列は特定のユーザーとして接続しますか?したがってSampleRole、そのユーザーに置き換えてください...
アーロンバートランド

列レベルの権限がここに行く方法です。それと、開発者がt-sqlを介して値を直接変更するとシステムが破壊されることを確実に把握できます。
mrdenny

6
-- prevent your web app user from updating that column directly:

DENY UPDATE ON dbo.YourTable(Price) TO WebApplicationUserName;
GO

-- create a stored procedure while logged in as sysadmin:

CREATE PROCEDURE dbo.UpdateYourTable
  @ProductID INT,
  @Price DECIMAL(10,2)
WITH EXECUTE AS OWNER
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE dbo.YourTable 
    SET Price = @Price
    WHERE ProductID = @ProductID;
END
GO

-- grant explicit access only to that stored procedure to the web app user:

GRANT EXEC ON dbo.UpdateYourTable TO WebApplicationUserName;

2

すべてのユーザーが同じログイン(痛い、BTW)を持っている場合、ここに別のオプションがあります

  • そのユーザー(またはその方法で行っている場合はロール)から更新権を取り消します。
  • 「所有者として実行」句を使用してストアドプロシージャを変更する
  • ストアドプロシージャは、それが存在するスキーマを所有しているユーザーの権限で実行されます(そのinの場合、dboすでにカバーされています)。

通常のアプリケーションユーザーには、そのテーブルの更新権限がないため、他の方法で更新することはできません。


これを行うために新しいユーザーを作成する必要はありません...
アーロンバートランド

@aaronbertrandあなたは正しい-だから、e reasonniは「作成者として実行する」と思っていたが、それは問題ではない-スキーマを所有するユーザーに権限がある限り、「所有者として実行する」ことができるそのテーブルを更新します。ストアドプロシージャがdboにある場合は、カバーされています。回答を更新します。
SqlRyan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.