मैंने MySQL में कुछ काम किया जहाँ मैंने TRIGGERS का उपयोग करके बैक-एंड में बहुत सारे व्यावसायिक तर्क रखे, मुझे PostgreSQL में माइग्रेट करना पड़ा और दुर्भाग्य से ट्रिगर तंत्र समान नहीं हैं। अब तक मुझे लगता है कि मुझे उन सभी को मैन्युअल रूप से रिकोड करना होगा।

यहां एक छोटी सी समस्या है: पोस्टग्रेस्क्ल ट्रिगर में जो डालने से पहले निष्पादित होता है मैं ट्रिगर फ़ंक्शन के भीतर से सम्मिलित ऑपरेशन को कैसे रद्द करूं?

उदाहरण: मेरे पास 2 फ़ील्ड (आईडी, फ़ील्ड_ए) वाली एक तालिका है, मेरे पास एक ट्रिगर है जो इस तालिका में एक पंक्ति डालने से पहले निष्पादित होता है।

बस इसे स्पष्ट करने के लिए मैं इस प्रविष्टि को ट्रिगर के भीतर से रद्द कर देता हूं यदि field_a = 5।

तो MySQL में मैंने यह किया (एक कस्टम अपवाद उठाया) और यह काम किया (सम्मिलित करना बंद कर दिया और एक कस्टम संदेश दिखाया):

CREATE TABLE `mydatabase`.`mytable` (
  `id` int(11) DEFAULT '0',
  `field_a` int(11) DEFAULT '0',
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC ;

CREATE DEFINER=`username`@`localhost` TRIGGER `the_trigger_in_mysql` BEFORE INSERT ON `mytable` FOR EACH ROW 

BEGIN
IF NEW.a_field = 5 THEN
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 'Please choose another number!!';
END IF;
END;

मैं यहां Postgresql के लिए भी ऐसा ही करने की कोशिश कर रहा हूं, Pgplsql और सभी के बारे में कुछ नई चीजें पढ़ रहा हूं

 CREATE TABLE "public"."mytable" (
      "id" int4 DEFAULT '0',
      "field_a"  int4 DEFAULT '0',
       CONSTRAINT "mytable__pkey" PRIMARY KEY ("id")
    ) ;
    
   ALTER TABLE "public"."log" 
  OWNER TO "username";

CREATE TRIGGER "the_trigger_in_postgresql" BEFORE INSERT ON "public"."mytable"
FOR EACH ROW
EXECUTE PROCEDURE "public"."the_trigger_in_postgresql_function"();

CREATE OR REPLACE FUNCTION "public"."the_trigger_in_postgresql_function"()
  RETURNS "pg_catalog"."trigger" AS $BODY$BEGIN 
    IF NEW.a_field = 5 THEN
        RAISE DEBUG 'Please choose another number!!';
    END IF;
RETURN NEW;
END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION "public"."the_trigger_in_postgresql_function"() OWNER TO "username";

दुर्भाग्य से यह काम नहीं करता! इस बारे में कोई विचार?

1
Aness 19 जुलाई 2020, 04:25

1 उत्तर

सबसे बढ़िया उत्तर

तो जैसा कि link by @user2864740 में बताया गया है, आइडिया अच्छा था। MySQL एक अपवाद उठा रहा है लेकिन मैं वर्तनी में गलत था कोड होना चाहिए

अपवाद उठाएँ 'कृपया कोई अन्य नंबर चुनें !!';

TRIGGER बॉडी फंक्शन में डीबग बढ़ाएँ के बजाय

1
Aness 19 जुलाई 2020, 01:37