2012-02-02 2 views
2

CakePHP 응용 프로그램을 개발 중입니다. 응용 프로그램이 여러 데이터베이스에 분산되어 있으며 통합 ACL 프레임 워크를 활용하기 때문에 UUID를 기본 키로 사용하고 싶습니다.UUID 기본 키가있는 CakePHP ACL

CakePHP는 2.1 나는 the tutorial에 따라 갈거야 그리고 난 지금은 오류를 얻고있다 그러나

CREATE TABLE acos (
    id uuid NOT NULL, 
    parent_id uuid DEFAULT NULL, 
    model VARCHAR(255) DEFAULT '', 
    foreign_key uuid DEFAULT NULL, 
    alias VARCHAR(255) DEFAULT '', 
    lft uuid DEFAULT NULL, 
    rght uuid DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE aros_acos (
    id uuid NOT NULL, 
    aro_id uuid NOT NULL, 
    aco_id uuid NOT NULL, 
    _create CHAR(2) NOT NULL DEFAULT 0, 
    _read CHAR(2) NOT NULL DEFAULT 0, 
    _update CHAR(2) NOT NULL DEFAULT 0, 
    _delete CHAR(2) NOT NULL DEFAULT 0, 
    PRIMARY KEY(id) 
); 

CREATE TABLE aros (
    id uuid NOT NULL, 
    parent_id uuid DEFAULT NULL, 
    model VARCHAR(255) DEFAULT '', 
    foreign_key uuid DEFAULT NULL, 
    alias VARCHAR(255) DEFAULT '', 
    lft uuid DEFAULT NULL, 
    rght uuid DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

다음에 DB 방식을 수정 한 :

오류 : SQLSTATE [42883] : 정의되지 않은 기능 : 7 오류 : 재미 ction max (uuid)가 존재하지 않습니다. LINE 1 : SELECT MAX ("Aro". "rght") AS "rght"from "public". "aros"AS "...^힌트 : 주어진 이름 및 인수와 일치하는 함수가 없습니다. 유형. 명시 적 타입 캐스트를 추가해야 할 수도 있습니다.

CakePHP의 버전은 2.1.0-beta이고 나는 UUID 데이터 형식의 PostgreSQL을 사용하고 있습니다.

누군가 UUID의 CakePHP ACL 프레임 워크를 성공적으로 사용 했습니까? CakePHP 프레임 워크에서이 애플리케이션의 향후 지원 가능성을 위해 최소한의 수정만으로이 작업을하고 싶습니다.

답변

1

data type UUID에 대해 정의 된 집계 함수 max()이 없습니다. UUID은 다른 UUID보다 "크다"고 간주되지 않습니다.

CREATE TEMP TABLE t(id uuid); 
INSERT INTO t VALUES 
('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11') 
,('b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'); 

SELECT max(id) FROM t; 

수익률 :

ERROR: function max(uuid) does not exist 
LINE 1: SELECT max(id) FROM t; 
      ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 

당신은 문제를 회피 할 수

은 다음과 데모를 생각해 보자.

b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 

을하지만 그건 단지 표준 텍스트 UUID를의 표현 것을 알고 :

SELECT max(id::text) FROM t; 

수익률을 : 당신이 알파벳 순으로 가장 큰 값을 원하는 경우 텍스트로 id 캐스트. 동일한 UUID는 다른 많은 형태로 표현 될 수 있습니다.

+0

글쎄, 왜 실패했는지 알지만 CakePHP ACL 프레임 워크에서 가장 단순한 방법을 찾고있다. 그래서 나는 내 자신의 "ACL 프레임 워크"를 만들 필요가 없다. 그러나 유형을 "문자 (36)"로 변경하면 코드가 오류없이 진행됩니다. 질문은 지금도 작동하고있는 경우에도 마찬가지입니다. – Marek

+0

@Marek 데이터 유형을 변경하지 않겠습니다. 질문은 왜 최대 UUID가 필요한지입니다. 계산을 수행하는 경우에만 값을 캐스팅하십시오. 당신은 또한 자신의 집계 함수'max (uuid)'를 작성할 수있다. –