2012-02-09 4 views
1

저는 웹 프로그래밍을 배우면서 관련된 원칙을 배우려고합니다. 파이어 버드 데이터베이스가 있는데, 간단한 "새로운 사용자"절차를 설정하려고합니다. 오류없이 실행되는 것처럼 보이지만 실제로는 새 사용자 레코드를 만들지 않습니다. 여기 파이어 버드 INSERT 절차가 실패하는 이유는 무엇입니까?

내 절차입니다 : (..., 암호 보안에 대한 댓글이 나도이 지금 연구 목적만을위한 것입니다주세요)

SET TERM^; 

RECREATE PROCEDURE NEW_USER (
NAME  VARCHAR(32), 
"PASSWORD" VARCHAR(128)) 
RETURNS (
ID   INTEGER) 
AS 
BEGIN 
    if (exists(
    select * from USERS 
    where NAME like :name)) then 
    id = -1; 
    else 
    insert into USERS 
    (NAME, PASSWORD, SALT) 
    values (:name, :password, '[email protected]') 
    returning ID into :id; 
    suspend; 
END^ 

SET TERM ;^

USERS 4 열이 포함 ID를 (자동 증가 INT 발전기에 의해 구동되는 필드), 이름, 패스워드 및 소금.

나는과 같이, 그것을 실행하려고하면 :

select ID from NEW_USER('Test', 'password') 

그것을 실행하고 빈 집합을 반환합니다. 다음 테이블을 쿼리하면 :

select * from USERS 

다른 빈 세트가 있습니다.

절차가 새 사용자를 생성하지 않는 이유는 무엇입니까?

+2

"발전기에 의해 구동되는 int autoincrement int field"란 무엇을 의미합니까? 최신 stable 버전 인 2.5는 autoincrement 필드를 지원하지 않습니다. 생성기를 사용하여'ID' 필드를 채우기 위해 수동으로 트리거를 생성해야합니다 ... 그렇게하지 않으면 아무것도 삽입되지 않을 수도 있습니다 (PK 필드 생성 실패). 오, 그리고 BTW 나는 당신이 쿼리를'commit'한다고 가정 하겠지? – ain

+0

@ain : 아하! 그것이 문제이다. 나는 이것을 Firebird Maestro로 설정했고 실제로 발전기를 사용하기위한 방아쇠를 만드는 것을 잊었다. 네가 대답하면 받아 들일거야. –

답변

4

"발전기에 의해 구동되는 int autoincrement int 필드"란 무엇을 의미합니까? 최신 stable 버전 인 2.5는 autoincrement 필드를 지원하지 않으므로 generator를 사용하여 ID 필드를 채우기 위해 수동으로 트리거를 생성해야합니다. 수행하지 않은 경우 아무 것도 삽입되지 않은 것일 수 있습니다 (실패 함 PK 필드 생성).

관련 문제