ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • View의 조회 권한
    SQL Server/GRANT 2012. 3. 26. 11:49

    안녕하세요~! SQLER에 제가 답변을 달은 부분을 이쁘게? 정리해봤습니다.

    여러 개의 데이터베이스에 있는 테이블을 뷰 하나로 만들 경우
    특정 유저에게 어떤 조건으로 조회권한만 줬을때 해결하는 방법입니다.

    원문: http://www.sqler.com/485639 


    Q.수고가 많으십니다.

    MS-SQL 2008사용자입니다.

    특정 뷰(VVVV) 1개만 조회권한을 주려고 합니다.


    예를 들면

    로그인계정(TTTT)을 만들어서( Default Database A)  1개의 뷰(VVVV)에 조회권한을 주었습니다.

    그 뷰 내용은 Database B, C에 있는 테이블과 조인되어 있어

    뷰조회시 "현재 보안 컨텍스트로는 서버 보안 주체 "VVVV"이(가) 데이터베이스 "B"에 액세스할 수 없습니다."

    라는 메세지가 뜹니다.

    Database B에 연결,선택권한을 주면 B의 테이블을 모두 조회할 수 있어 다른 방법을 찾고있습니다.

    고수님들의 조언 부탁드립니다.



    답변

    1번 세션


    use master
    go
    create database a
    go
    create database b
    go
    create database c
    go
    
    --//로그인 생성
    create login test2345 WITH PASSWORD = '12341234'
    GO
    
    
    create table a.dbo.test1( idx int)
    create table b.dbo.test2( idx int)
    create table c.dbo.test3( idx int)
    
    --//SQL Server 2008이상이라면..
    insert into A.dbo.test1 values(1),(2),(3)
    insert into b.dbo.test2 values(4),(5),(6)
    insert into c.dbo.test3 values(7),(8),(9)
    GO
    /*
    SQL Server 2005 이전이면 .. 아래처럼
    insert into A.dbo.test1 values(1)
    insert into A.dbo.test1 values(2)
    insert into A.dbo.test1 values(3)
    insert into b.dbo.test2 values(4)
    insert into b.dbo.test2 values(5)
    insert into b.dbo.test2 values(6)
    insert into c.dbo.test3 values(7)
    insert into c.dbo.test3 values(8)
    insert into c.dbo.test3 values(9)
    */
    
    
    use a
    go
    --//a database에 view를 생성
    create view vi_select_tests
    as
     select idx from a.dbo.test1
     union all select idx from b.dbo.test2
     union all select idx from c.dbo.test3
    go
    --//a 디비에 유저 추가
    sp_adduser 'test2345'
    --//a 디비에 view 조회조건 추가..
    GRANT SELECT ON vi_select_tests TO test2345
     
    

    여기까지 셋팅이 된 상태에서.. 2번 세션을 test2345 계정으로 접속 

    2번세션 

    use a
    go
    select * from vi_select_tests
    Msg 916, Level 14, State 1, Line 1
    현재 보안 컨텍스트로는 서버 보안 주체 "test2345"이(가) 데이터베이스 "c"에 액세스할 수 없습니다.
    


    다시 1번 세션


    1번세션 

    USE b
    GO
    sp_adduser 'test2345' --//b 디비에 test2345 유저 추가
    GRANT SELECT ON test2 TO test2345 --//view에 있는 테이블 select 권한 부여
    GO
    USE C
    GO
    sp_adduser 'test2345' --//c 디비에 test2345 유저 추가
    GRANT SELECT ON test3 TO test2345 --//view에 있는 테이블 select 권한 부여
    


    다시 2번세션

    2번세션 

    select * from vi_select_tests
    --//정상적인 조회가 되는 걸 확인할 수 있습니다.
    



    하지만.. 이렇게 되면.. 'test2345' 라는 유저가..
    select * from b.dbo.test2
    select * from c.dbo.test3
    의 조회는 가능하겠죠~~!

     감사합니다 ^^


Designed by Tistory.