डेटा प्रविष्टि की अनुमति नहीं देने के लिए दो कॉलम शून्य होने पर मैं पहले_इन्सर्ट ट्रिगर बनाने की कोशिश कर रहा हूं। जिस विचार को मैंने लागू करने का प्रयास किया था, वह सम्मिलन के समय दोनों स्तंभों पर शून्य बाधा उत्पन्न करना था और बाद में उस बाधा को दूर करना था।

मुझे एसक्यूएल के बारे में ज्यादा जानकारी नहीं है और मैंने निम्नलिखित कोड का उपयोग करने की कोशिश की:

CREATE DEFINER = CURRENT_USER TRIGGER `db_autoescola`.`contas_recebers_BEFORE_INSERT` BEFORE INSERT ON `contas_recebers` FOR EACH ROW
BEGIN
    IF NEW.id_recepcionista IS NULL and NEW.id_instrutor IS NULL
    THEN ALTER TABLE contas_recebers MODIFY id_recepcionista INT NOT NULL;
         ALTER TABLE contas_recebers MODIFY id_instrutor INT NOT NULL;
    END IF;
END

हालाँकि, इस ट्रिगर को लागू करने का प्रयास करते समय मेरे पास निम्न त्रुटि है और मैं यह पहचानने में असमर्थ था कि इसे ठीक करने के लिए क्या आवश्यक है।

Operation failed: There was an error while applying the SQL script to the database.
Executing:
DROP TRIGGER IF EXISTS `db_autoescola`.`contas_recebers_BEFORE_INSERT`;

DELIMITER $$
USE `db_autoescola`$$
CREATE DEFINER = CURRENT_USER TRIGGER `db_autoescola`.`contas_recebers_BEFORE_INSERT` BEFORE INSERT ON `contas_recebers` FOR EACH ROW
BEGIN
    IF NEW.id_recepcionista IS NULL and NEW.id_instrutor IS NULL
    THEN ALTER TABLE contas_recebers MODIFY id_recepcionista INT NOT NULL;
         ALTER TABLE contas_recebers MODIFY id_instrutor INT NOT NULL;
    END IF;
END$$
DELIMITER ;

ERROR 1422: Explicit or implicit commit is not allowed in stored function or trigger.
SQL Statement:
CREATE DEFINER = CURRENT_USER TRIGGER `db_autoescola`.`contas_recebers_BEFORE_INSERT` BEFORE INSERT ON `contas_recebers` FOR EACH ROW
BEGIN
    IF NEW.id_recepcionista IS NULL and NEW.id_instrutor IS NULL
    THEN ALTER TABLE contas_recebers MODIFY id_recepcionista INT NOT NULL;
         ALTER TABLE contas_recebers MODIFY id_instrutor INT NOT NULL;
    END IF;
END
1
RafaelTI 12 फरवरी 2021, 16:52

2 जवाब

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

डीडीएल (डेटा डेफिनिशन लैंग्वेज) का उपयोग:

 ALTER TABLE 

एक अंतर्निहित प्रतिबद्धता उत्पन्न करें और ट्रिगर में इसकी अनुमति नहीं है। आप डेटा संरचना रनटाइम नहीं बदल सकते हैं, डेटा में हेरफेर करने से पहले ये ऑपरेशन किए जाने चाहिए।

1
Braiam 12 फरवरी 2021, 17:18

धन्यवाद @scaisEdge, इस बात को ध्यान में रखते हुए मैं एक समाधान के साथ आने में सक्षम था:

तालिका को बदलने की कोशिश करने के बजाय मैंने यह जांचने के लिए एक नोटल कॉलम बनाया है कि दोनों शून्य हैं, इस तरह अगर मैं सत्य या अन्यथा कोई मान देता हूं तो मैं इसे शून्य मान पास कर दूंगा। इस तरह मैं अपने आवेदन में अपवाद प्राप्त कर सकता हूं और जिस तरह से मैं चाहता हूं उसका इलाज कर सकता हूं।

कोड:

CREATE DEFINER = CURRENT_USER TRIGGER `contas_recebers_BEFORE_INSERT` BEFORE INSERT ON `contas_recebers` FOR EACH ROW BEGIN
    IF NEW.id_recepcionista IS NULL and NEW.id_instrutor IS NULL
    THEN SET NEW.ids_null = null;
    else SET NEW.ids_null = TRUE;
    END IF;
END

मेरे मन में है कि यह एक मूर्खतापूर्ण समस्या भी हो सकती है और समाधान सर्वश्रेष्ठ में से एक नहीं है, लेकिन जिस तरह से मैं इसे हल करने में कामयाब रहा, शायद यह किसी और की मदद करेगा।

0
RafaelTI 12 फरवरी 2021, 17:46