2013-01-24 11 views
11

पर डालने के बाद ट्रिगर मेरे पास एक सारणी है जिसमें दो not null कॉलम Created और Updated शामिल हैं।नल कॉलम

मैं इसी चलाता

ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
AFTER INSERT 
AS 
BEGIN 
    UPDATE Category 
    SET Created = GETDATE(), Updated = GETDATE() 
    FROM inserted 
    WHERE Category.ID = inserted.ID; 
END 

और

ALTER TRIGGER [dbo].[tr_category_updated] ON [dbo].[Category] 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE Category 
    SET Updated = GETDATE() 
    FROM inserted 
     inner join [dbo].[Category] c on c.ID = inserted.ID 
END 

लिखा था लेकिन अगर मैं एक नई पंक्ति सम्मिलित कर रहा हूँ मैं कोई त्रुटि मिलती है

स्तंभ में Null मूल्य सम्मिलित नहीं कर सकते 'बनाया ', तालिका ' श्रेणी '; कॉलम नल की अनुमति नहीं देता है। INSERT विफल रहता है।

सम्मिलित आदेश:

INSERT INTO [Category]([Name], [ShowInMenu], [Deleted]) 
    VALUES ('category1', 0, 0) 

मैं कैसे इन स्तंभों के लिए एक सेटिंग के बिना इस तरह चलाता लिख ​​सकते हैं अशक्त अनुमति देने के लिए?

+8

यदि आप 'insert' पर स्वचालित रूप से 'दिनांक' को अपडेट करना चाहते हैं, तो मैं आपको' ट्रिगर ' – DON

+3

की बजाय' डिफ़ॉल्ट 'बाधा का उपयोग करने का सुझाव देता हूं क्योंकि त्रुटि उत्पन्न होती है क्योंकि ट्रिगर केवल प्रविष्टि के बाद काम करता है, और आप कॉलम मान नहीं डाल रहे हैं डालने के समय 'बनाया गया' और 'अपडेट किया गया'। – TechDo

+1

जैसा कि ट्रिगर का नाम पहले से कहता है, ट्रिगर आग ** ** के बाद ** सम्मिलित हुआ है - लेकिन आपको किसी भी 'न्यूल' कॉलम के लिए 'INSERT' पर ** ** ** ** प्रदान करना होगा। तो आपको या तो उन कॉलम के प्रारंभिक मूल्य को सेट करने के लिए 'INSTEAD INSERT' ट्रिगर लिखना होगा - बहुत आसान: केवल उस कॉलम पर 'डिफॉल्ट (GETDATE())' बाधा परिभाषित करें ताकि यह स्वचालित रूप से 'INSERT पर भर जाए '.... –

उत्तर

3

इस तरह अपनी मेज को संशोधित करने के लिए लिंक की जांच करें एक तालिका में डिफ़ॉल्ट CURRENT_TIMESTAMP के साथ टाइमस्टैम्प कॉलम। इसे दूर करने के लिए आपको NULL मान created कॉलम में डालना होगा और आपके पास मौजूदा टाइमस्टैम्प दोनों कॉलम होंगे।

INSERT INTO yourTable (col1, created) VALUES ('whatever', NULL); 

या आप

ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT '1970-01-01 00:00:00'; 

की तरह एक मान्य टाइमस्टैम्प करने के लिए डिफ़ॉल्ट सेट और इस तरह आपके ट्रिगर संशोधित:

ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
AFTER INSERT 
AS 
BEGIN 
    UPDATE Category 
    SET Created = GETDATE() 
/* FROM inserted */ /*don't know where you got that from, do you port from SQL Server?*/ 
    WHERE Category.ID = NEW.ID; 
END 
2

त्रुटि उत्पन्न होती है क्योंकि ट्रिगर केवल प्रविष्टि के बाद काम करता है, और आप डालने के समय कॉलम मान Created और Updated नहीं डाल रहे हैं।

तो त्रुटि को समाप्त करने के लिए, आप डालने के साथ कॉलम Created और Updated को सम्मिलित/पॉप्युलेट कर सकते हैं। या आप कॉलम की डिफ़ॉल्ट मान संपत्ति जोड़ सकते हैं।

ALTER TABLE yourTable MODIFY COLUMN updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 
ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT 0; 

0. करने के लिए स्तंभ के लिए बनाया के लिए डिफ़ॉल्ट सेट दुर्भाग्य से MySQL दो अनुमति नहीं देता: विवरण

Add column, with default value, to existing table in SQL Server

Specify Default Values for Columns

1

संभावित उपयोग INSTEAD OF ट्रिगर

CREATE TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
INSTEAD OF INSERT 
AS 
BEGIN 
    INSERT Category(Name, ShowInMenu, Deleted, Created, Updated) 
    SELECT Name, ShowInMenu, Deleted, GETDATE(), GETDATE() 
    FROM inserted i 
END 
0

मैं आम तौर पर सभी आखिरी अद्यतन कॉलम शून्य होने के बाद से मैं जानना चाहता हूं कि इसे कभी बदला नहीं गया है या नहीं। तुम दोनों क्षेत्रों रखना चाहिए, तो नल मैं इस तरह उन स्तंभों लिए एक डिफ़ॉल्ट मान जोड़ना होगा:

ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [Created] 
GO 

ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [LastUpdated] 
GO 

तो फिर तुम डालने के लिए ट्रिगर जरूरत नहीं होगी।

यदि आप वास्तव में एक ट्रिगर का उपयोग करना चाहते हैं तो आपको के बजाय INSTEAD OF निर्दिष्ट करना होगा और सम्मिलित कथन शामिल करना होगा।

संबंधित मुद्दे