Я использую триггер под названием «users_id_trigger» для автоматического увеличения столбца users.user_id.
Но в Object Browser его статус отображается как недействительный!
Я работаю над проектом PHP, где я получаю эту ошибку, в то время как я запускаю запрос из сценария PHP. вот сообщение об ошибке:
oci_execute (): OCI_SUCCESS_WITH_INFO: ORA-24344: успех с ошибкой компиляции
Вот мой метод создания всей таблицы и связанных SEQUENCE и TRIGGER, чтобы иметь возможность автоматического увеличения в столбце user_id.
public function create_users_table()
{
// creating users table
oci_execute(oci_parse($this->conn, "CREATE TABLE users(
user_id NUMBER(10) NOT NULL,
user_name VARCHAR2(100) NOT NULL,
user_password VARCHAR(100) NOT NULL,
user_email VARCHAR(100) NOT NULL,
user_location VARCHAR(100) NOT NULL,
CONSTRAINT users_pk PRIMARY KEY (user_id)
)"));
// creating users sequence
oci_execute(oci_parse($this->conn, "CREATE SEQUENCE users_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
NOCACHE;
"));
// creating user sequence trigger
echo oci_execute(oci_parse($this->conn, "CREATE OR REPLACE TRIGGER users_id_trigger
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
:new.user_id := users_seq.nextval;
END;
"));
}
Что я делаю не так? потому что таблица и последовательность созданы успешно, но не триггер.
РЕДАКТИРОВАТЬ:
при вставке новой строки я получил эту ошибку:
вставить в значения пользователя (1, ‘hasan’, ‘1234’,
«[email protected]», «Дакка, Бангладеш»)
* ОШИБКА в строке 1: ORA-04098: триггер ‘FLIPLISTS.USERS_ID_TRIGGER’ недействителен и не прошел повторную проверку
Версия Oracle, которую я использую: Oracle Database 11g Express Edition, выпуск 11.2.0.2.0 — 64-разрядная версия (Windows 10)
Ошибка компиляции: ORA-04082: НОВЫЕ или СТАРЫЕ ссылки не допускаются в триггерах уровня таблицы
Если используемая вами версия oracle меньше 11g, измените триггер, как показано ниже.
CREATE OR REPLACE TRIGGER users_id_trigger
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
select users_seq.nextval into :new.user_id from dual ;
END;
Проблема в том, что у вас есть новые строки на окнах, поэтому удалите их.
echo oci_execute(oci_parse($this->conn, trim(preg_replace('/\s+/', ' ', "CREATE OR REPLACE TRIGGER users_id_trigger
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
:new.user_id := users_seq.nextval;
END;
"));));