Sql 用于检查不同表中两项的触发器

Sql 用于检查不同表中两项的触发器,sql,oracle,triggers,Sql,Oracle,Triggers,为此,我有了这些表(Usuario、compra和tarjeta_credito)和嵌套表Pago CREATE OR REPLACE TYPE Usuario_ObjTyp AS OBJECT ( id_usuario NUMBER(8), nick VARCHAR2(20), nombre VARCHAR(20), apellido VARCHAR(20), email VARCHAR(30), contrasena VARCHAR(30), ct_amigos NUMBER(4), dir

为此,我有了这些表(Usuario、compra和tarjeta_credito)和嵌套表Pago

CREATE OR REPLACE TYPE Usuario_ObjTyp AS OBJECT (
id_usuario NUMBER(8),
nick VARCHAR2(20),
nombre VARCHAR(20),
apellido VARCHAR(20),
email VARCHAR(30),
contrasena VARCHAR(30),
ct_amigos NUMBER(4),
direccion VARCHAR2(30),
localidad VARCHAR2(20),
cp VARCHAR2(7),
pais VARCHAR2(20),
telefono VARCHAR2(10),
Tarjetas REF Tarjeta_Credito_ObjTyp,
PayPal_Usuario REF Paypal_ObjTyp,
 MAP MEMBER FUNCTION Get_Nick RETURN VARCHAR2
);

CREATE OR REPLACE TYPE Tarjeta_Credito_ObjTyp AS OBJECT(
id_tarjeta NUMBER(8),
num_tarjeta VARCHAR2(30),
fecha_caducidad DATE,
ccv NUMBER(3),
MAP MEMBER FUNCTION Get_numTarjeta RETURN VARCHAR2
);

CREATE OR REPLACE TYPE Pago_ObjTyp AS OBJECT(
cod_pago NUMBER(8),
cantidad_pago NUMBER(5,2),
fecha_pago DATE,
Tarjeta_Credito REF Tarjeta_Credito_ObjTyp,
Paypal REF Paypal_ObjTyp,

CONSTRUCTOR FUNCTION Pago_ObjTyp
(SELF IN OUT NOCOPY Pago_ObjTyp, cod_pago NUMBER,
cantidad_pago NUMBER, fecha_pago DATE, Tarjeta_Credito
Tarjeta_Credito_ObjTyp, PayPal Paypal_ObjTyp)
RETURN SELF AS RESULT
);
CREATE OR REPLACE TYPE pago_ntabtyp AS TABLE OF Pago_ObjTyp;

CREATE OR REPLACE TYPE Compra_ObjTyp AS OBJECT (
num_compra NUMBER(8),
fecha_compra DATE,
precio_totalc NUMBER(5,2),
lineasCompra Linea_Compra_ntabtyp,
Usuario REF Usuario_ObjTyp,
pagoCompra pago_ntabtyp,
MAP MEMBER FUNCTION Get_numcompra RETURN NUMBER
);
我想做的是检查用户(Usuario)是否正在使用另一张非他的信用卡(Tarjeta_Credito)。例如,如果我有一个id_tarjeta为1的用户,它需要检查当我插入购买(Compra)和支付(Pago)时,信用卡是否与该用户关联的信用卡相同(id_tarjeta=1),如果不是1,则会出错(在本例中)。 此外,Usuario只能有一张信用卡,因此不需要循环检查信用卡

我现在的情况是:(这不正确)

我试图制作变量,以便比较用户id(Usuario)和信用卡id(tarjeta_credito),但我觉得我太困惑了,我不知道如何继续

编辑和实际操作:我尝试了这个,但仍然不起作用,有什么帮助吗? ´´´ 创建或替换触发器动作\u compatarjeta 插入或更新压缩对象选项卡之前 每行

BEGIN    
    IF ((:NEW.PagoCompra).tarjeta_credito) IS NOT NULL THEN
           IF ( (deref(:new.usuario).tarjetas)= ((:new.pagocompra).tarjeta_credito)) THEN
            raise_application_error(-20000, 'No coinciden las tarjetas');
            END IF;
END IF;

    IF UPDATING THEN
        UPDATE COMPRA_OBJTAB SET num_compra = :NEW.num_compra, fecha_compra = :NEW.fecha_compra, precio_totalc = :NEW.PRECIO_TOTALC, lineasCompra = :NEW.lineasCompra, 
        Usuario = :NEW.Usuario, PagoCompra = :NEW.PagoCompra
        WHERE num_compra = :OLD.num_compra;
    END IF;
结束


我不建议您通过触发器来执行此操作。您可以创建一个单独的存储过程,其中包含您计划在触发器中包含的逻辑。然后,您可以先调用此SP;如果一切顺利,你可以继续你的正常流程,否则向最终用户展示必要的验证。哦,我明白了,也许那样会更容易。非常感谢你!
BEGIN    
    IF ((:NEW.PagoCompra).tarjeta_credito) IS NOT NULL THEN
           IF ( (deref(:new.usuario).tarjetas)= ((:new.pagocompra).tarjeta_credito)) THEN
            raise_application_error(-20000, 'No coinciden las tarjetas');
            END IF;
END IF;

    IF UPDATING THEN
        UPDATE COMPRA_OBJTAB SET num_compra = :NEW.num_compra, fecha_compra = :NEW.fecha_compra, precio_totalc = :NEW.PRECIO_TOTALC, lineasCompra = :NEW.lineasCompra, 
        Usuario = :NEW.Usuario, PagoCompra = :NEW.PagoCompra
        WHERE num_compra = :OLD.num_compra;
    END IF;