2017-11-30 6 views
0

새로 만든 테이블에 사용 권한 (즉, GRANT)을 프로그래밍 방식으로 설정하려고합니다. SQL Server에서 데이터베이스의 다른 테이블로 이동하여 마우스 오른쪽 단추를 누른 다음 "Script Table as"를 수행하여 스크립트를 표시하려고했지만 그 밑에있는 GRANT 옵션이 표시되지 않습니다.프로그래밍 방식으로 테이블에 대한 사용 권한 설정

SQL Server에이 스크립트를 표시 할 수 있습니까?

+0

'SomeTable to SomeUser'의 grant select와 같은가요? 테이블에있는'GRANT ALL'은'DELETE, INSERT, REFERENCES, SELECT, UPDATE'가 될 것입니다. – scsimon

+0

특정 권한을 가진 특정 사용자. –

+0

* 실제 * 문제는 사용 권한을 설정하지 않습니다. * 특정 테이블에서 기존 사용 권한을 페치합니다. 그게 맞습니까? –

답변

1

좀 더 둘러보십시오. 간단한 버전은 사용 권한을 설정하는 대화 상자를 사용하는 것입니다. 예를 들어,

enter image description here

더 일반 및 고급 접근

- 훨씬 더 많은 옵션 - 데이터베이스 수준에서 스크립트 기능을 사용하는 것입니다. 데이터베이스에서 마우스 오른쪽 버튼을 클릭하고를 선택한 다음 마법사를 실행하여 원하는 테이블과 스크립트 옵션을 선택하십시오. 스크립팅 옵션 탭의 고급 단추를 클릭하십시오. "개체 수준 권한"(기본적으로 해제 됨)이 표시됩니다.

+0

감사 이것은 바로 그 장소와 같습니다. 그러나 _Script_ 아래로 끌어서 _Script Action to New Query Window_를 선택하면 "스크립팅 할 작업이 없습니다"라는 메시지가 나타납니다. _Script_ 아래의 모든 선택 항목에 대해 발생합니다. 왼쪽에 권한 페이지가 선택되어 있고 * 사용자 또는 역할 : * 목록이 선택되어 있고 권한이 선택되어 있습니다 (이 경우 부여 : 삭제, 부여 : 삽입, 부여 : 선택 및 부여 : 업데이트) –

+0

그런 다음 당신은 아무 것도 변경하지 않았습니다. 첫 번째 제안은 권한 변경을 할 때 적용되며 ** 특정 시점에 변경된 **에 대해 실행될 실제 tsql 스크립트를보고 싶을 때 적용됩니다. ** – SMor

+0

OIC, 멋지 네요. 해당 상자를 선택 취소 한 다음 다시 확인하여 스크립트를 볼 수 있습니다. –

1

댓글이 너무 깁니다. 이 경우

GRANT <n> ON YourDatabase.YourSchema.YourTable TO YourSpecificUser 

, 그것은 테이블 이후 <n> 다음 중 하나가 될 수 있습니다

  • DELETE
  • INSERT
  • REFERENCES
  • SELECT
  • UPDATE

사용자가 fixed database role 인 경우 사용자가 명시 적으로 부여한 것보다 많은 액세스 권한이있을 수 있습니다. GRANT Object Permissions에 대해 자세히 알아보십시오. 참고로

, 당신은 sp_table_privileges

sp_table_privileges @table_name = 'YourTable' 

당신은 동적 SQL 쿼리를 작성하는 그들을 통해 이러한 결과를 다음 루프를 캡처 할 수 있습니다 사용할 수있는 테이블에 대한 사용 권한 목록을 반환합니다.

아래 스크립트를 TableName으로 바꾸고 NewTableName을 입력하십시오. 인쇄물에 만족하면 exec(@sql)의 주석 처리를 제거하여 인쇄 된 코드를 실행할 수 있습니다.

if object_id('tempdb..#priv') is not null 
drop table #priv 

create table #priv(ID int identity (1,1) 
        ,TABLE_QUALIFIER varchar(64) 
        ,TABLE_OWNER VARCHAR(64) 
        ,TABLE_NAME VARCHAR(64) 
        ,GRANTOR VARCHAR(64) 
        ,GRANTEE VARCHAR(64) 
        ,PRIVILEGE VARCHAR(64) 
        ,IS_GRANTABLE VARCHAR(8)) 

insert into #priv 
exec sp_table_privileges @table_name = 'YourTableName' 

declare @i int = 1 
declare @max int = (select max(id) from #priv) 
declare @sql varchar(max) = '' 

while (@i <= @max) 
begin 
    set @sql = @sql + (select ' GRANT ' + stuff(PRIVILEGE,1,0,' ') + ' ON ' + stuff(TABLE_NAME,1,0,' ') + ' TO ' + stuff(GRANTEE,1,0,' ') + char(13) + ' GO ' + char(13) from #priv where ID = @i) 
    set @i = @i + 1 
end 

print(@sql) 
set @sql = replace(@sql,'YourTableName','NewTableName') 
print(@sql) 
--exec(@sql) 
+0

노력해 주셔서 감사합니다. 그러나이 질문에는 대답하지 않습니다. –

+0

그래서 당신은 커서와 동적 SQL과 함께 절차의 결과를 사용하려는 것 – scsimon

+0

@AlLelopath 편집을 참조하십시오 – scsimon