2012-03-22 2 views
0

У меня возникли проблемы с созданием этого триггера в PostgreSQL 8.4.Исключение триггера PostgreSQL

CREATE OR REPLACE FUNCTION tbi_Usuarios() RETURNS TRIGGER AS $tbi_Usuarios$ 
    BEGIN 
     IF trim(both ' ' from NEW.Nombre_usuario) = '' OR NEW.Nombre_usuario IS NULL THEN 
      RAISE EXCEPTION 'Debes ingresar un nombre de usuario.'; 
     END IF; 

    IF NEW.Password = '' OR NEW.Password IS NULL THEN 
     RAISE EXCEPTION 'Debes ingresar una contraseña correctamente'; 
    ELSE 
     NEW.Password := md5(NEW.Password); 
    END IF; 

    IF Fecha_registro IS NULL THEN 
     NEW.Fecha_registro := current_timestamp; 
    END IF; 

    RETURN NEW; 
END; 
$tbi_Usuarios$ LANGUAGE plpgsql; 

DROP TRIGGER IF EXISTS tr_tbi_Usuarios ON "Usuarios"; 
CREATE TRIGGER tr_tbi_Usuarios BEFORE INSERT ON "Usuarios" 
FOR EACH ROW EXECUTE PROCEDURE tbi_Usuarios(); 

Дело в том, что, когда я пытаюсь вставить строку в базу данных, следующее сообщение об ошибке появляется:

"el registro <<new>> no tiene un campo <<nombre_usuario>>" 

или на английском языке:

"the table <<new>> doesn't have a column <<nombre_usuario>>" 

Но в моем база данных, я ДЕЙСТВИТЕЛЬНО уверен, что столбцы Nombre_usuario, Password, Fecha_registro есть!

Может ли кто-нибудь мне помочь?

ответ

2

Вы, скорее всего, столкнулись с именами верхних регистров. Я не устаю советоваться не использовать их.

Вы, вероятно, есть столбец с именем

"Nombre_usuario" 

заключена в двойные кавычки (""), сохраняющих смешанный случай орфографию.
Но в функции запуска вы пишете:

NEW.Nombre_usuario 

без двойных кавычек. Идентификаторы без кавычек преобразуются в нижний регистр. Так что это так же, как:

NEW.nombre_usuario 

но не:

NEW."Nombre_usuario" 

Всегда двойные кавычки смешан идентификаторы случая. Или (намного лучше) исключительно используйте идентификаторы нижнего регистра, чтобы начать и избавить себя от этой проблемы.

Начать чтение главы "Identifiers and Key Words" в руководстве.

+0

Спасибо! Это сработало! – KGs