2012-02-09 8 views
1

私はWebプログラミングをしていて、関わっている原則を学ぼうとしています。私はFirebirdデータベースを持っており、簡単な「新しいユーザー」の手順を設定しようとしています。エラーなく実行されるように見えますが、実際には新しいユーザーレコードは作成されません。Firebird 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 

もう1つ空のセットがあります。

この手順で新しいユーザーを作成しない理由は何ですか?

+2

「オートインクリメントintフィールドで発電機で動く」とはどういう意味ですか?最新の安定版リリース2.5は自動インクリメントフィールドをサポートしていませんので、ジェネレータを使って 'ID'フィールドに手動でトリガーを作成しなければなりません。もしこれをしていなければ、何も挿入されていないかもしれません(PKフィールドの生成に失敗した)。ああ、BTW私はあなたが ''クエリをコミットすると思いますか? – ain

+0

@ain:ああ!それが問題です。これをFirebird Maestroで設定し、実際に発電機を使用するトリガーを作成するのを忘れてしまった。あなたがそれを答えるなら、私はそれを受け入れるでしょう。 –

答えて

4

「オートインクリメントのintフィールドが発電機によって駆動される」とはどういう意味ですか?最新の安定版リリース2.5では自動インクリメントフィールドはサポートされていませんので、手動でジェネレータを使用してIDフィールドに記入するトリガーを作成する必要があります。これを行わないと、何も挿入されないPKフィールドを生成する)。

関連する問題