업데이트시 created_at (customer_entity 테이블)가 변경되도록 설정된 이유는 무엇입니까?


19

customer_entity테이블 의 구조를 볼 때 created_at필드에 다음 속성이 있음을 알았습니다 on update CURRENT_TIMESTAMP. 따라서 행이 업데이트 될 때마다 created_at타임 스탬프가 변경됩니다.

이 속성은 updated_at필드가 아닌 필드에 존재하는 것 같습니다 created_at. 이 테이블이 EAV 구조로 인해 직접 수정되는 경우는 드물지만 여전히 created_at필드를 수정하는 것은 잘못된 것 같습니다 .

이 테이블 구조에 대한 이유가 있습니까, 아니면 버그입니까?

편집 : Magento에서 확인 된 버그 보고서를 찾았습니다. 문제 # 27944. 불행히도, 당신은 그것을 보려면 로그인해야합니다. http://www.magentocommerce.com/bug-tracking/issue?issue=13882


2
좋은 질문. 나는이 테이블이 같은 상황에있는 것을 추가 할 수 있습니다 : cron_schedule, api_user, admin_user, customer_entity_address, downloadable_link_purchased, downloadable_link_purchased_item, index_event, eav_entity log_customer, sales_flat_quote_address, sales_flat_quote, sales_flat_quote_address_item, sales_flat_quote_payment, sales_flat_quote_shipping_rate, sales_recurring_profile. 다른 사람들도있을 수 있습니다. 나는 그들을 찾는 동안 한 시점에서 관심을 잃었습니다.
Marius

내가 눈치 sales_flat_quote첫째, 다음 확인 customer_entity. 우리의 보고서 중 일부가 이해가되지 않았기 때문에 방금 그 사실을 알게되었습니다. 이것이 실제로 버그 일 수 있습니까?
Ryre

나는 그것이 단지 버그라고 생각합니다.
Dmytro Zavalkin

그 문제를 해결할 방법이 있습니까? 죄송합니다. 초보자이며 1.7.0.2에서 1.8.1로 업그레이드 한 후 동일한 문제에 직면하고 있습니다. 데이터베이스에서 필드를 편집하려고 거의 두려워합니다. 당신이 도울 수 있기를 바랍니다! 감사합니다 Jinal
Jinal

@Jinal, 가장 좋은 방법은 mysql을 통해 변경하는 것입니다. 자세한 내용은 Marius의 답변을 확인하고 먼저 데이터베이스를 백업하십시오!
Ryre

답변:


22

여기 내가 찾은 것이 있습니다. 이 문제는 Magento CE 1.6 이상 (및 일치하는 EE 버전)에서만 나타납니다. mysql과 함께 DDL을 사용하는 새로운 설치 / 업그레이드 스크립트 때문입니다.
버전 1.6 전에이는 방법 created_atupdated_at 같은 모습입니다.

`created_at` datetime NOT NULL default '0000-00-00 00:00:00',
`updated_at` datetime NOT NULL default '0000-00-00 00:00:00', 

1.6 이상에서 ddl은 다음과 같습니다.

    ->addColumn('created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
        'nullable'  => false,
        ), 'Created At')
    ->addColumn('updated_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
        'nullable'  => false,
        ), 'Updated At')

다음을 생성합니다.

`created_at` timestamp NOT NULL COMMENT 'Created At',
`updated_at` timestamp NOT NULL COMMENT 'Updated At',

차이점은 default값이 없다는 것입니다.
그리고 여기에 설명 ,

DEFAULT CURRENT_TIMESTAMP와 ON UPDATE CURRENT_TIMESTAMP가 없으면 DEFAULT CURRENT_TIMESTAMP와 ON UPDATE CURRENT_TIMESTAMP를 모두 지정하는 것과 같습니다.

그리고 MySQL은 하나의 타임 스탬프 열만 CURRENT_TIMESTAMP기본값 또는on update 하므로 created_at열은 다음과 같이 끝납니다.

이것은 확실히 마 젠토 버그입니다.


1
이것에 대한 magento의 업데이트가 있습니까? 버그가 여전히 새로운 상태 인 것 같습니다.
Laura

@Laura, 답변의 버그 추적 링크는 여전히 열려 있습니다 (지금 2 년 동안!).
Ryre

2
Magento 1.9에서 created_at 열은 created_attimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Created At'를 나타냅니다. 그리고 릴리스 정보에서는 ""고객 이후 "날짜가 정확합니다."라고 언급했습니다.
MagePsycho 2016 년

EE의 경우 1.6 이전 버전에 영향을 미칩니다. EE 1.13이 있으며 다음과 같습니다. `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Created At'
doc_id

4

우선 Marius의 답변을 읽고 데이터베이스에서 무슨 일이 일어나고 있는지 확인하십시오.

모델이 제대로 확장되면 대부분의 개발자가이 문제에 부딪치지 않을 것이라고 언급하고 싶었습니다 Mage_Core_Model_Abstract. 스택은 다음과 같습니다 :

  1. Your_Model::save 전화
  2. Mage_Core_Model_Abstract::save 전화
  3. Mage_Eav_Model_Entity_Abstract::save 전화
  4. Mage_Eav_Model_Entity_Abstract::_beforeSave 전화
  5. Mage_Eav_Model_Entity_Abstract::walkAttributes 전화
  6. Mage_Eav_Model_Entity_Attribute_Backend_Time_Created::beforeSave

이것은 다음을 수행합니다.

$attributeCode = $this->getAttribute()->getAttributeCode();
$date = $object->getData($attributeCode);
if (is_null($date)) {
    if ($object->isObjectNew()) {
        $object->setData($attributeCode, Varien_Date::now());
    }
}

이것은 CE> = 1.8.x 및 EE> = 1.13.x의 일부 로케일에 문제 가있을 수 있습니다.


2

우리는 또한이 버그를 발견했으며 미국과 유럽 날짜 인코딩의 차이점을 기반으로한다고 생각합니다.

미국에서는 날짜가 MM-DD-YYYY로 작성됩니다. (2015 년 2 월 10 일 = 2015 년 2 월 10 일). 그러나 유럽 및 기타 여러 장소에서 날짜는 DD-MM-YYYY로 작성됩니다. (2015 년 10 월 2 일-2015 년 10 월 2 일 또는 2015 년 10 월 2 일).

마 젠토는 미국에 본사를두고 있지만 대부분의 개발은 우크라이나의 프로그래머가 수행했습니다. 

무료 Magento 확장으로이 버그를 수정했습니다 (따라서 Magento 코어 코드를 변경할 필요가 없습니다). http://www.CustomerParadigm.com/download/Magento-Date-Switch-Fix-Extension.zip : 우리 사이트에 무료로 다운로드했습니다.

나는 우리의 블로그에서 이것을 더 자세히 다루었 다 : http://www.customerparadigm.com/magento-bug-magento-customer-create-date-juxtaposition/


1
블로그 게시물 및 모듈은 내 SE 게시물에서 가져온 것입니다 : magento.stackexchange.com/a/31225
Tyler V.

-1

ce 1.9는 ce 1.8.1의 버그를 수정했습니다. 아래는 차이점입니다. 여기에 이미지 설명을 입력하십시오


1
여기의 새로운 코드는이 문제에 대한 해결책이 아닙니다. "DDDD-DD-DD DD : DD : DD"형식의 유효성을 검사하거나 null을 반환합니다. 이 null은 여전히 ​​데이터베이스에 도달하고 열 기본값이 무엇이든됩니다.
Tyler V.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.