Вопрос триггера SQL: почему это синтаксическая ошибка? - PullRequest
0 голосов
/ 19 апреля 2009

Я хотел бы создать триггер для Sybase, но он показывает ошибку.

То, что я хочу сделать, - это когда операция удаления выполняется в таблице [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*

Ответы [ 2 ]

3 голосов
/ 19 апреля 2009

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

Руководство пользователя Sybase SQL (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.

1 голос
/ 19 апреля 2009

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

...