2013-04-16 2 views
1

하나의 데이터베이스 연결/인스턴스 (모든 스키마)에 대한 삽입 또는 업데이트를 수신하는 트리거를 만들 수 있습니까?MySQL 글로벌 연결에 대한 트리거

  • 나는 하나 개의 MySQL 서버에 여러 개의 스키마를 가지고 :

    은 여기 내 비즈니스 사례입니다.

  • 이러한 스키마 각각에는 여러 테이블이 있습니다.
  • 모든 테이블에는 'lastChanged'datetime 열이 있습니다.
  • 해당 테이블에서 업데이트 또는 삽입이 발생할 때마다 테이블의 'lastChanged'열을 업데이트해야합니다.

요약하면 모든 스키마의 모든 테이블에 대해 트리거를 만들 필요가없는 전역 규칙을 만들 수 있는지 알아보기 위해 노력하고 있습니다.

트리거에 대한 경험이 많지 않으므로 이러한 이벤트를 잡아 내고 대응하는 테이블의 행을 업데이트하면 트리거 이외의 다른 것을 생각해 보면 환상적인 답이 될 것입니다!

답변

1

단일 트리거로는이 작업을 수행 할 수 없습니다.

lastChanged 열을 DATETIME to TIMESTAMP으로 변경하면 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 기능을 사용하여 삽입 또는 업데이트시 자동으로 값을 설정할 수 있습니다.

TIMESTAMP 데이터 형식은 1970에서 2038까지의 값만 지원할 수 있으므로이 범위를 벗어나는 값을 저장해야하는 경우 사용할 수 없습니다.

가능한 한 간단하게 만들고 모든 테이블에 이미 lastChanged이라는 열이 있다고 했으므로 information_schema을 사용하여 필요한 alter table 문을 생성 한 다음 모두에서 실행하십시오 일단. 이 같은

뭔가 :

select concat('alter table ', 
    t.table_schema, 
    '.', 
    t.table_name, 
    ' modify column ', 
    c.column_name, 
    ' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;') as ddl 
into outfile '/tmp/lastChanged.sql' 
from information_schema.columns c 
    inner join information_schema.tables t 
    on t.table_schema = c.table_schema and t.table_name = c.table_name 
where c.table_schema = database() 
and c.data_type = 'datetime' 
and c.column_name = 'lastChanged' 
and t.table_type = 'base table'; 

\. /tmp/lastChanged.sql 
관련 문제