2009-04-19 3 views
0

Я хотел бы создать триггер для Sybase, но он показывает ошибку.Вопрос о запуске SQL: почему это синтаксическая ошибка?

Что я хочу сделать, когда в таблице [student] выполняется операция удаления, чтобы проверить, есть ли какая-либо запись, связанная со студентом, в [account], и если да, то создайте исключение.

Возможно, отсутствует поддержка Sybase. Их чиновники, похоже, не люди, чтобы посетить.

*CREATE TRIGGER AccountChecker 
BEFORE DELETE ON student 
REFERENCING OLD AS old_student 
FOR EACH ROW 
BEGIN 
DECLARE @acc CHAR(4); 
DECLARE @acc_not_null EXCEPTION FOR SQLSTATE '99999'; 

SELECT @acc=account.account_number FROM account 
WHERE account.student_id = old_student.student_id; 

    IF @acc IS NOT NULL 
    BEGIN 
    SIGNAL acc_not_null 
    END 

END* 
+0

Какая ошибка показывает это? – 2009-04-19 11:14:26

+0

Я использую SyBase ISQL, он показывает около НАЧАТЬ в строке: 14, но если я удалить IF @acc IS NOT NULL НАЧАТЬ СИГНАЛ acc_not_null END Это еще ошибка, если я удалить из строки 9 (Начать с Выберите ...) в строке 15, это успех. – Cheung

+0

Правильно: он показывает ошибку около BEGIN в строке: 14 – Cheung

ответ

3

Sybase поддерживает внешние ключи и первичные ключи, как через процедуры, такие как sp_primarykey и sp_foreignkey, так и через декларативные ограничения SQL. То, что вы пытаетесь сделать, - это именно то, что должен сделать внешний ключ из [учетной записи], ссылающийся на [ученика].

Руководство Sybase SQL User (Adaptive Server 15, если это имеет значение) иллюстрирует «удалить ограниченные» триггер (с несколькими иным отступом):

create trigger deltitle 
    on titles 
    for delete 
    as 
     if (select count(*) 
       from deleted, salesdetail 
       where salesdetail.title_id = 
       deleted.title_id) > 0 
     begin 
      rollback transaction 
      print "You cannot delete a title with sales." 
     end 

Я не уверен, что откат является хорошей идеей ; исключение, вероятно, лучше.

Нотация, которую вы пытаетесь использовать, более тесно связана со стандартом SQL, чем документированная нотация Sybase.

+0

спасибо, Jonathan Leffler Это хорошее альтернативное решение. – Cheung

1

Не поддерживает ли Sybase внешние ключи?