특정 열의 업데이트를 제한하십시오. 저장 프로 시저 만 해당 열을 업데이트하도록 허용


17

저장 프로 시저를 통해서만 업데이트하려는 민감한 가격 열이 있습니다. 업데이트하도록 설계된 저장 프로 시저를 사용하지 않는 경우 이러한 가격 열의 값을 변경하려는 모든 코드 또는 수동 시도가 실패하고 싶습니다.

트리거와 토큰 테이블을 사용하여 이것을 구현하는 것을 고려하고 있습니다. 내가 생각하는 아이디어는 토큰 테이블을 갖는 것입니다. 저장 프로시 저는 먼저 토큰 테이블에 값을 삽입해야합니다. 그런 다음 가격 열을 업데이트하십시오. 업데이트 트리거는 토큰이 업데이트 된 행의 토큰 테이블에 존재하는지 확인합니다. 발견되면 계속됩니다. 토큰을 찾지 못하면 예외가 발생하고 업데이트 트랜잭션이 실패합니다.

이 제한을 구현하는 좋은 방법이 있습니까?


1
열 기반 보안에 대한보기를 사용할 수 있습니다. 그것은 방아쇠보다 훨씬 우아 할 것입니다. 사용자에게보기에 대한 권한을 부여하지만 기본 데이터는 허용하지 않습니다.
토마스 스트링거

좋은 지적입니다. 그러나 연결 풀링을 사용하는 많은 응용 프로그램을 중단하지 않고도 문제가 해결되지 않은 상태로 유지됩니다.
Elias

이것이 "연결 풀링을 사용하는 많은 응용 프로그램을 중단"하는 방법을 설명 할 수 있습니까?
Aaron Bertrand

답변:


21

SQL Server는 열 수준 권한을 허용합니다. 예를 들면 다음과 같습니다.

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

Michal에게 감사하지만이 솔루션은 작동하지 않습니다. 내 응용 프로그램은 연결 풀링을 사용하는 웹 응용 프로그램이기 때문입니다. 모든 사용자는 동일한 SQL Server 연결 문자열을 사용하여 연결합니다.
Elias

1
@Elias 이해가 안됩니다. 연결 문자열은 특정 사용자로 연결됩니다. 따라서 SampleRole해당 사용자로 교체하십시오 .
Aaron Bertrand

열 수준 권한이 여기에 있습니다. 이를 통해 개발자는 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

모든 사용자가 동일한 로그인 (ouch, BTW)을 가진 경우 다른 옵션이 있습니다.

  • 해당 사용자 (또는 역할을 수행하는 경우 역할)의 업데이트 권한을 취소합니다.
  • "execute as owner"절을 사용하여 저장된 proc을 변경하십시오.
  • 저장된 proc은 자신이 상주하는 스키마를 소유 한 사용자의 권한으로 실행됩니다 (in의 경우 dbo이미 다룹니다).

일반 응용 프로그램 사용자에게는 해당 테이블에 대한 업데이트 권한이 없으므로 다른 방법으로는 업데이트 할 수 없습니다.


이를 위해 새 사용자를 만들 필요는 없습니다.
Aaron Bertrand

@aaronbertrand 당신이 맞아요. 그래서 reasonni는 당신이 "창조자로서 실행"을 할 것이라고 생각했지만 그건 아닙니다. 스키마를 소유 한 사용자가 권한을 가지고 있다면 "소유자로서 실행" 해당 테이블을 업데이트하십시오. 저장된 proc이 dbo에 있다면 다루는 것입니다. 답변을 업데이트하겠습니다.
SqlRyan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.