보통 우리가 SQL 형식으로 데이터를 조회할 때 SELECT를 사용한다. 이 중 특정 조건에 해당하는 값을 가져올때 다양한 방식으로 표현하게 되는데, 만일 아래와 같이 작성했다고 하자.

SELECT * FROM splist WHERE id>10

저렇게 되면 splist 안의 데이터 중 id가 10보다 큰 모든 값을 들고 온다. 아마도 이 바닥(IT, 프로그래머들이 가득찬....)에서 위와 같이 코드를 짜게 되면 별거 아니면 상관 없지만, ERP 같은 대규모 DB 로 구성된 솔루션을 사용 중이라면 욕 진탕 얻어 먹을 것이다.
특별한 경우가 아닌 경우 보통 아래와 같은 스타일로 SELECT를 하라고 할 것이다.

SELECT [id],[name],[address] FROM splist WHERE id>10

그러면 최소한 id는 10 이상인 것 중에 id, name, address 만 해당하는 값만 쭉 가져오게 된다.

자... 그럼 이제 SPList에서 SPQuery를 이용할 때를 살펴보자.

보통 SPQeury라는 객체를 사용하는 것은 SPList 내에 특정 데이터를 가져올 때 사용하기 위한 부분이다. 그래서 그 SPQuery안에 있는 Query라는 속성 값 내에 <WHERE></WHERE>  라는 형식의 검색 조건을 넣어 처리하곤 한다.

만일 아래와 같이 코드를 짰다면... 어떻게 될까?

SPList list = web.GetList("/Lists/PresidenSchedule1");

SPQuery query = new SPQuery();
query.Query = "<Where><DateRangesOverlap><FieldRef Name=\"EventDate\" />
<FieldRef Name=\"EndDate\" /><FieldRef Name=\"RecurrenceID\" />
<Value Type=\"DateTime\"><Now  /></Value>
</DateRangesOverlap>
</Where><OrderBy>
<FieldRef Name=\"EventDate\" /></OrderBy>";
query.CalendarDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day);
query.RowLimit = 10;
query.RecurrenceOrderBy = true;
query.ExpandRecurrence = true;

 SPListItemCollection items = list.GetItems(query);


저 코드가 바로 SELECT * FROM ~ WHERE ~ 스타일인 코드이다.
그렇다면 이 SPQuery에서는 어떻게 특정 Field만 가져오게 할까?

방법은 간단하다. SPQuery의 ViewFields를 설정하면 된다.
StringBuilder sbFields = new StringBuilder();
sbFields.Append("<FieldRef Name=\"EventDate\" />");
sbFields.Append("<FieldRef Name=\"EndDate\" />");
sbFields.Append("<FieldRef Name=\"ID\" />");
sbFields.Append("<FieldRef Name=\"Title\" />");
sbFields.Append("<FieldRef Name=\"RecurrenceID\"  />");
sbFields.Append("<FieldRef Name=\"fAllDayEvent\" />");
sbFields.Append("<FieldRef Name=\"fRecurrence\" />");
query.ViewFields = sbFields.ToString();

즉 GetItems 를 실행하기 전에 SPQuery 안에 저렇게 ViewField들을 정의해주면 간단하게 끝난다.

물론 자체적으로  Sharepoint가 Cache로 가지고 있어서, 어느정도는 후후 되지만, 그래도 깔삼하게 필요한 것만 가져오는게 좋지 않을까?




728x90

보통 일반적인 게시판에서는 올린 글에 대해서는 누구든지 보게 된다.
또한 특정 글의 수정 작업은 자신이 작성한 항목에 대해서만 수행할 수 있게 된다.

그런데, 혹시 아래와 같은 기능이 필요할 수 있다.
1. 하나의 게시판을 여러사람이서 공유하지만, 마치 자신만의 글만 보이도록 하고 싶다.
2. 어떠한 글이든, 권한만 있으면 편집이 가능하다.
3. 모든 사용자가 아이템 자체를 편집 못하게 한다. ( 마감 처리 )

사실 1번과 같은 사항은 대개 View를 수정해서 자신이 작성한 글만 보이게 처리할 수 있다.
하지만, 만일 View를 바꿔 보게 되면 전체가 다 보이므로 1번의 조건에 합당하게 처리되지 않는다.  2번 같은 경우에는 글이나 문서가 공유되는 것이라서 팀 사이트 의 경우 팀 구성원이 원하는데로 수정가능한 경우를 의미한다.
3번의 경우는 해당 게시판의 만료적인 의미로 두면 되며, 더 이상 누구도

이 처리를 위한 방법은 SPList의 속성 중 아래의 2개의 프로퍼티가 이런 기능을 제공하게 된다.

int SPList.ReadSecurity

 속성 내에 넣는 값
 1 - 모든 사용자가 모든 아이템을 읽을 수 있다.
 2 - 자신이 생성한 아이템에 대해서만 읽을 수 있다.

int SPList.WriteSecurity

 속성 내에 넣는 값
 1 - 모든 사용자가 모든 아이템을 권한만 있으면 편집 가능하다.
 2 - 사용자가 생성한 아이템만 편집 가능하다.
 4 - 누구도 아이템에 대해 편집이 불가능하다. ( 사이트 관리자만 가능 )


위의 속성만 세팅하게 되면, 각각의 기능을 수행할 수 있게 된다.

기본 값으로 ReadSecuriry는 1이, WriteSecuriy는 1로 설정되어 있다.

만일 위의 3가지 요구사항중 1번을 처리하려면,
ReadSecurity를 1, WriteSecurty는 1또는 3을 넣으면 된다.

2번을 처리하려면,
ReadSecurity를 1, WriteSecurty는 1로 넣으면 된다.

3번을 처리하려면,
ReadSecurty를 1, WriteSecurty를 4로 넣으면 된다.

728x90

SPList 개체에서 특정 사용자의 특정 권한을 체크하고 싶을 때 사용하는 방법이다.
일전 SK 에너지(구 SK Corp)에서 게시판에서 처리한 방법을 보면
아래와 같이 처리되어 있었다.

// 1번 그룹이 바로 글 쓰기 권한
SPList list = SPContext.Current.Web.GetList(".....");
newItemGroup = 1;
usableNewItem = false;
SPGroup group = SPContext.Current.Web.Groups[newItemGroup];
if( group.ContainsCurrentUser == true )
{
      // SPList에 글쓰기가 있으니.. 쓰는 권한에 관련된 처리를 여기에..
      SPListItem newItem = list.items.Add();
       ......
}


위의 방법대로 하기 위해서는 newItemGroup의 그룹을 찾아야 되는 문제가 있다.
이에 간단하게 해결하는 방법이 있는데 아래와 같다.

SPList list = SPContext.Current.Web.GetList(".....");
if(list.DoesUserHavePermissions(SPBasePermissions.AddListItems))
{
     // SPList에 글쓰기가 있으니.. 쓰는 권한에 관련된 처리를 여기에..
      SPListItem newItem = list.items.Add();
       ......
}

DoesUserHavePermissions 이 메소드 안에, SPBasePermissions 항목에
체크하고자 하는 권한들을 넣으면 된다.
만일 여러개의 권한 체크가 필요할 시에는 '&'로 연결해서 체크하면 된다.

if(list.DoesUserHavePermissions(SPBasePermissions.AddListItems | SPBasePermissions.EditListItems))
{
    // SPList에 글쓰기가 있으니.. 쓰는 권한에 관련된 처리를 여기에..
      SPListItem newItem = list.items.Add();
       ......
}



수정 : if(list.DoesUserHavePermissions(SPBasePermissions.AddListItems & SPBasePermissions.EditListItems)) 라고 썼던 부분을
if(list.DoesUserHavePermissions(SPBasePermissions.AddListItems | SPBasePermissions.EditListItems)) 로 수정합니다.
& -> |


 

728x90

+ Recent posts

728x90