2009-04-19 9 views
0

Je voudrais créer un déclencheur pour Sybase, mais il montre une erreur. Ce que je veux faire est, quand une opération de suppression est faite sur la table [student], pour vérifier s'il y a n'importe quel enregistrement lié à l'étudiant sur [compte], et si oui, soulevez une exception.Question de déclenchement SQL: pourquoi est-ce une erreur de syntaxe?

Il semble y avoir un manque de support de la part de Sybase. Leurs officiels ne semblent pas des gens à visiter.

*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

Quelle erreur affiche-t-elle? –

+0

J'utilise sybase ISQL, Il montre près BEGIN en ligne: 14, mais si je retire IF @acc IS NOT NULL BEGIN SIGNAL acc_not_null FIN Il reste une erreur, si je retire de la ligne 9 (à partir de Sélectionnez ...) à la ligne 15, c'est un succès. – Cheung

+0

Correct: Afficher l'erreur près de BEGIN en ligne: 14 – Cheung

Répondre

3

Sybase prend en charge les clés étrangères et les clés primaires, à la fois via des procédures telles que sp_primarykey et sp_foreignkey et via des contraintes SQL déclaratives. Ce que vous cherchez à faire est exactement ce qu'une clé étrangère de [compte] référençant [étudiant] devrait faire.

Le Guide de l'utilisateur Sybase SQL (Adaptive Server 15, si elle importe) illustre une 'suppression restreinte' trigger (avec indentation quelque peu différente):

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 

Je ne suis pas convaincu que rollback est une bonne idée ; une exception est probablement meilleure.

La notation que vous essayez d'utiliser respecte plus étroitement le standard SQL que la notation Sybase supportée.

+0

merci, Jonathan Leffler C'est une bonne solution alternative. – Cheung

1

Sybase ne prend-il pas en charge les clés étrangères?