정기적 혹은 조건적으로 컨텐츠를 정리(삭제)해 줄 수 있는 모듈

정기적 혹은 조건적으로 컨텐츠를 정리(삭제)해 줄 수 있는 모듈

위 제목에 100% 적합한 모듈은 아니지만 어느 정도 목적 달성이 가능한 모듈이다.

SQL Cron 모듈 - http://drupal.org/project/sqlcron

만일 CCCC라는 컨텐츠 타입을 2달간만 보관하고 그 이전에 것은 저절로 삭제하게
하고 싶다면, 아래의 SQL 문장(MySQL 전용)을 하나씩 테스트 해 보면 된다.

1. 현재로부터 2달전 날짜 구하기
SELECT SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH )

2. 현재로부터 2달전 날짜의 타임스탬프 구하기 (드루팔의 node.created가 timestamp 값을 int 형태로 보유)
SELECT UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )

3. 현재로부터 2달이 지난 컨텐츠 타입 CCCC의 데이타를 구하기
SELECT n.* FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
AND n.created < UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )

* 추가) 리비젼을 가지고 있는 컨텐츠 타입이라면, node_revisions를 먼저 정리해야 한다.

SELECT * FROM node_revisions WHERE nid IN (
SELECT n.nid as nid FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
AND n.created < UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )
);
DELETE FROM node_revisions WHERE nid IN (
SELECT n.nid as nid FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
AND n.created < UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )
);

4. 현재로부터 2달이 지난 컨텐츠 타입 CCCC의 데이타를 삭제하기

DELETE FROM node WHERE node.type = 'CCCC' AND node.status = 1
AND node.created < UNIX_TIMESTAMP( SUBDATE( CURRENT_DATE, INTERVAL 2 MONTH ) )

위 4번의 SQL을 SQL Cron 모듈에 장착하고 정기적으로 실행하면,
원하는 목적 - 정기적으로 컨텐츠를 삭제 - 을 이룰 수 있다.

------------------------------------------

이와 달리 시간이 아닌 갯수로 컨텐츠 타입 CCCC를 통제하고 싶다면,
아래와 같은 (별로 예쁘지는 않다) SQL이 어떨까 싶다.


1. 컨텐츠 타입 CCCC의 최신 데이터 100개 이외의 데이터를 구하기.
SELECT * FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
ORDER BY n.created DESC LIMIT 100, 99999
* 이때 99999 부분은 적절히 조절이 필요하다. (더 좋은 방법은 없을까?)

1. 컨텐츠 타입 CCCC의 최신 데이터 100개 이외의 101번째 데이터를 변수화.
SET @lastnid=(SELECT n.nid  FROM node AS n
WHERE n.type = 'CCCC' AND n.status = 1
ORDER BY n.created DESC LIMIT 101,1);
SELECT @lastnid;

2. 컨텐츠 타입 CCCC의 최신 데이터 100개 이외의 데이터를 확인/삭제.
SELECT * FROM node WHERE node.type='CCCC' AND node.nid<@lastnid;
DELETE FROM node WHERE node.type='CCCC' AND node.nid<@lastnid;

[주의점]
* DELETE 에서는 LIMIT xxx 는 가능해도 LIMIT xxx, yyy 가 안된다.
* MySQL 5.0? 에서는 Sub쿼리에 LIMIT 를 사용하면 안된다.
* Stored Procedure를 사용하면 더 편하겠다.

[참고]
* http://api.drupal.org/api/function/node_delete/6 를 참고하라.

Your rating: None 평균 : 4.3 (3 votes)

댓글

주의) SQL Cron 모듈에

주의) SQL Cron 모듈에 추가한 SQL문이 복수행인 경우에는, 2009년 3월 기준으로 하나씩 태스크를 나눠서 등록하는 것이 좋다. 위에 오는 것이 먼저 실행되는 것 같다.

주의) SQL로 DB조작에 자신이 없는 경우에는 사용하지 않는 것이 좋겠다! node 와 node_revisions 테이블은 드루팔 API에 의해서 제어하는 것을 권장하는데, 본 방법은 두 테이블 간의 데이터 정합성을 파괴, 데이터 목록 표시 화면이 이상해 질 수도 있다.

Rules 모듈

Rules 모듈 http://drupal.org/project/rules 의 Scheduled rules로도 비슷한 일을 할 수 있을 것 같습니다. 지적해주신대로 실수로 DB를 잘못 건드릴 수도 있으니까요. 아직 간단한 룰만 써봤는데, 조만간 '지정한 content type의 node를 한 달 후에 자동 삭제하고 Admin에게 notification email을 보내는' 룰을 테스트해볼겁니다 ㅎㅎ

액션 모듈과 다른

액션 모듈과 다른 모양입니다. 더 강력한 것인가 보죠?
http://palpal.org/node/99

확실히 이런 종류의 모듈들은 여러모로 쓰임새가 많은 것 같아요.
드루지기도 관심가지고 살펴보렵니다. 댓글 감사합니다~

네 Rules는 Actions

네 Rules는 Actions 그리고 Token하고 묶여서 작동하는 것 같구요, Triggered rule이나 Scheduled rule을 쓸 수 있어서 조금 더 유연한 것 같아요.
지금 http://drupal.org/node/517674 이 글 보고 세팅하는 중입니다^^
이 Rules를 기반으로 작동하는 Node expire module도 있더라구요. 이건 노드 작성할 때 작성자가 expire를 정할 수도 있구요, Admin이 content-type마다 정할수도 있더라구요. 그런데 저는 딱 한 가지만 하면 되는거라 Rules로 해보려구요.

역시 비슷한 모듈들이라 참고삼아 적어봅니다 :)
http://drupal.org/project/scheduler
http://drupal.org/project/auto_expire

유용한 정보

유용한 정보 감사합니다!
마침 어떤 프로젝트에서 예약 메일 발송 기능이 있는데 적용하는 걸 검토해봐야겠습니다.