2016-06-13 1 views
1

열의 모든 사용자가 업데이트를 허용하지 않을 수 있습니까? 다음 표 생각해 내 시스템의 무결성을 유지하기 위해SQL Server 2012의 모든 환경에서 모든 사용자에 대해 열의 업데이트를 허용하지 않음

Create table [MyTable] 
(
    [Id] int not null identity primary key, 
    [Description] varchar(30) not null, 
    [Length] int not null 
) 

을, 나는 [Length] 열이 레코드를 삽입 한 후 변경 할 수 없습니다 필요가있다.

  1. 트리거를 사용하여 :

    create trigger [Trigger_MyTable] on [MyTable] 
    for update 
    as 
    begin 
        if UPDATE([Length]) 
        begin 
         RAISERROR('Change not allowed.', 16, 1) 
         Rollback Transaction 
        end 
    end 
    
  2. DENY UPDATE를 사용하여 :

    DENY UPDATE ON [MyTable]([Length]) TO [User1] 
    

내가 '이유는 여기에

내가 탐험 몇 가지 옵션이 있습니다 우리에게 멸시당한 트리거는 과거에 트리거가있는 테이블로 작업 할 때 업데이트 구문을 수행 할 때 상당한 성능 저하를 경험했습니다. 편리에 의해

DENY UPDATE 기능 것 (예. 빨리, 테스트하지 않았습니다 수 있습니다. < 일초 트리거를 삭제 한 후, 테이블에 20,000 행이 instead of update 트리거 4-5 분이 소요 For update을 업데이트)하지만이 할 수있는 방법이있다 모든 사용자 (관리자/소유자 사용자 포함)에게 적용됩니까?

감사합니다.

답변

3

우발적 인 업데이트를 방지하는 가장 신뢰할 수있는 방법이 트리거입니다.

deny이 작동하지 않는 sysadmin 역할 또는 데이터베이스 소유자의 사용자에 대한 사용 권한이 검사되지는 않지만이 사용자는 더 이상 보안을 추가하지 않으므로 항상 트리거를 비활성화 할 수 있습니다.

2012 년에 있다면 이론적 인 가능성이 한 가지 더 있습니다.

IDENTITY 열은 불변하고, 시퀀스와 기존의 신원을 대체 할 길이 열 IDENTITY을하고 모든 삽입을 명시 적 값을 삽입하기에 SET IDENTITY_INSERT을 확보 할 수 있도록 업데이트 할 수 없습니다.

이것은 다른 개발자들에게는 혼란을 줄 수 있지만 여전히 DELETE...INSERT 쌍으로 업데이트되는 것을 막지는 못합니다.

+0

ID 열의 값은 업데이트 할 수 있습니다. SET IDENTITY_INSERT ON | OFF'를 참조하십시오. 트리거가 가장 좋은 방법 인 것처럼 보이지만 소유자와 관리자는 여전히 해당 트리거를 삭제하거나 사용 중지 할 수 있습니다. –

+0

@PhilipKelley 아니요,'identity_insert'는 당신이 그들을 삽입 할 수있게 해주고, 업데이트하지는 않습니다. 적절한 권한을 가진 사람이 [이 접근법] (http://stackoverflow.com/questions/751522/how-to-change-identity-column-values-programmatically/17249583#17249583)을 사용할 수 있지만 단순히 삭제하고 삽입하는 것이 더 쉬울 것입니다. –

관련 문제