2009-02-17 12 views
5

क्या एमएस एसक्यूएल सर्वर तालिका में डेटक्रेटेड कॉलम घोषित करने का कोई विशेष तरीका है ताकि इसे स्वचालित रूप से उचित समय-स्टाम्प के साथ भर दिया जाए?एसक्यूएल सर्वर में दिनांकित कॉलम?

या .. क्या मुझे क्वेरी करने पर मैन्युअल रूप से डेटाटाइम प्रदान करना होगा, मैन्युअल रूप से?

उत्तर

10

आप स्तंभ का डिफ़ॉल्ट मान सेट कर सकते हैं करने के लिए "getdate()"

+1

ध्यान रखें कि इसे उपयोगकर्ताओं द्वारा बाईपास किया जा सकता है क्योंकि जब आप वास्तविक मान डालते हैं तो डिफ़ॉल्ट मान को ध्यान में नहीं रखा जाता है। और इसे उपयोगकर्ताओं द्वारा भी अपडेट किया जा सकता है। यह संभवतः पर्याप्त है यदि आप नियंत्रित कर सकते हैं कि SQL क्या चल रहा है (और आप नहीं कर सकते :-) लेकिन यह सुरक्षित नहीं है। – paxdiablo

+0

यह वास्तव में एक अच्छी बात है क्योंकि यदि किसी उपयोगकर्ता के पास एक विशिष्ट तारीख है तो उसे वहां रखने की आवश्यकता है, संभवतया तब तक अनुमति दी जानी चाहिए जब तक कि आपके पास अन्यथा नियम न हो। – James

+0

आदरपूर्वक असहमत, @ जेम्स। क्या आपने सरबान-ऑक्सले के बारे में नहीं सुना है? :-) यदि आपके पास डेटक्रेटेड कॉलम है, तो इसे पंक्ति की तारीख पर सेट किया जाना चाहिए। यदि आप उपयोगकर्ता-परिवर्तनीय कॉलम चाहते हैं, तो इसे डेटक्रेटेडफोरपुर्पोज़ऑफफ्राउड या कुछ समान कहा जाना चाहिए। – paxdiablo

15

डिफ़ॉल्ट मान दो प्रमुख कमियां से ग्रस्त हैं।

  • यदि सम्मिलन कथन कॉलम के लिए मान निर्दिष्ट करता है, तो डिफ़ॉल्ट का उपयोग नहीं किया जाता है।
  • कॉलम किसी भी समय अपडेट किया जा सकता है।

ये मतलब है कि आप यह सुनिश्चित नहीं कर सकते कि मूल्य आपके नियंत्रण के बाहर संशोधित नहीं किए गए हैं।

आप सही डेटा अखंडता चाहते हैं (ताकि आप यकीन है कि पंक्ति में तारीख निर्माण तिथि है कर रहे हैं), तो आपको चलाता उपयोग करने के लिए की जरूरत है।

कॉलम को वर्तमान दिनांक में सेट करने के लिए एक ट्रिगर ट्रिगर और उस कॉलम में परिवर्तनों को रोकने के लिए एक अद्यतन ट्रिगर (या, अधिक सटीक रूप से, इसे अपने वर्तमान मान पर सेट करें) डेटक्रेटेड कॉलम को लागू करने का तरीका है।

एक डालने और आज की तारीख करने के लिए स्तंभ स्थापित करने के लिए अद्यतन ट्रिगर एक DateModified स्तंभ लागू करने के लिए तरीका है।

(संपादित उपयोगकर्ता गेब्रियल से - यहाँ के रूप में इस लागू करने के लिए मेरे प्रयास है वर्णित - मैं 100% यकीन है कि यह सही है नहीं कर रहा हूँ, लेकिन मैं आशा करती हूं कि ओपी उसकी समीक्षा कर ...):

CREATE TRIGGER [dbo].[tr_Affiliate_IU] 
    ON [dbo].[Affiliate] 
    AFTER INSERT, UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Get the current date. 
    DECLARE @getDate DATETIME = GETDATE() 

    -- Set the initial values of date_created and date_modified. 
    UPDATE 
     dbo.Affiliate 
    SET 
     date_created = @getDate 
    FROM 
     dbo.Affiliate A 
     INNER JOIN INSERTED I ON A.id = I.id 
     LEFT OUTER JOIN DELETED D ON I.id = D.id 
    WHERE 
     D.id IS NULL 

    -- Ensure the value of date_created does never changes. 
    -- Update the value of date_modified to the current date. 
    UPDATE 
     dbo.Affiliate 
    SET 
     date_created = D.date_created 
     ,date_modified = @getDate 
    FROM 
     dbo.Affiliate A 
     INNER JOIN INSERTED I ON A.id = I.id 
     INNER JOIN DELETED D ON I.id = D.id 
END 
+0

यदि आप पर्यावरण और एप्लिकेशन को नियंत्रित करते हैं तो आप डेटा स्तर तक पहुंच नियंत्रित करते हैं। तब दो चिंताएं अप्रासंगिक हो जाती हैं। –

+0

वास्तव में, आपको नहीं लगता कि कोई व्यक्ति जेडीबीसी ड्राइवर के साथ डीबीएमएस से कनेक्ट हो सकता है? और एन-स्तरीय के प्रमुख फायदों में से प्रत्येक को अपनी ईमानदारी के लिए जिम्मेदार प्रत्येक स्तर है। आप कभी भी डीबी को एप्लिकेशन द्वारा संरक्षित नहीं करते हैं जब यह स्वयं की रक्षा कर सकता है। वह परेशानी के लिए पूछ रहा है। – paxdiablo

+0

@ पैक्स: नहीं, मैं नहीं करता हूं। एक विज्ञापन-प्रसार कनेक्शन एक उचित सुरक्षित वातावरण से कनेक्ट नहीं हो सकता है। सुरक्षा डीएमबीएस की एकमात्र जिम्मेदारी नहीं है (यह एक शुरुआती बिंदु प्रदान करती है) क्योंकि यह एक कोपरेट/प्लेटफार्म चौड़ी रणनीति होनी चाहिए। –

0

निश्चित रूप से है।

यहां आपके लिए कार्रवाई में एक उदाहरण है।

Create table #TableName 
(
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    CreatedDate DATETIME NOT NULL DEFAULT GETDATE(), 
    SomeDate VARCHAR(100) 
) 

INSERT INTO #TableName (SomeDate) 
SELECT 'Some data one' UNION ALL SELECT 'some data two' 

SELECT * FROM #TableName 

DROP TABLE #TableName 
+0

और क्या होता है जब एक असंतुष्ट कर्मचारी "अपडेट # टेबल सेट CREATEDDATE = GETDATE()" के साथ आता है? बैंग, आपकी सभी मूल्यवान जानकारी तब जाती है जब पंक्तियां बनाई गई थीं। – paxdiablo

+2

@ पैक्स: मेरे टर्फ पर नहीं होगा हालांकि, संभवतः ऐसा होने की संभावना में, मैं बस हमारी डीआर प्रक्रियाओं को लागू करता हूं और डेटा पुनर्प्राप्त करता हूं। लगता है जैसे आपको अपनी सुरक्षा रणनीति और कर्मचारियों को नैतिकता देखने की आवश्यकता है :-) –

+1

"मोरेल", लेकिन हो सकता है कि उनके नैतिकता की भी जांच की जानी चाहिए :-) वैसे भी, रोकथाम हमेशा वसूली से बेहतर होती है। यह डाउनटाइम और कुछ डाउनटाइम के बीच का अंतर है (किसी भी राशि से कोई भी बेहतर नहीं है)। सिस्टम ज़ेड पर डीबी 2 में यह संभवतः पर्यावरण है, हम हमेशा पागल हो जाते हैं। – paxdiablo

2

हम CreatedDate पर डिफ़ॉल्ट है और ट्रिगर

वहाँ बार जब हम स्पष्ट रूप से तिथि निर्धारित करना चाहते हैं के साथ लागू न करें - जैसे अगर हम किसी अन्य स्रोत से डेटा आयात करते हैं।

वहाँ एक जोखिम है कि आवेदन बग सका CreateDate, या उस बात के लिए एक असंतुष्ट डीबीए

(हम गैर DBAs हमारे डीबीएस के लिए सीधी जोड़ने की जरूरत नहीं है) मैं तुम्हें स्तंभ सेट कर सकते हैं लगता है के साथ गड़बड़ CreateDate पर स्तर अनुमतियां। 1 टेबल, ताकि स्तंभ मुख्य तालिका के बाहर था:

एक आधे रास्ते घर में एक सम्मिलित ट्रिगर एक 1 में एक पंक्ति बनाने के लिए हो सकता है। दूसरी तालिका में चयन अनुमतियां हो सकती हैं, जहां मुख्य तालिका में अद्यतन अनुमतियां होती हैं, और इस प्रकार CreateDate में परिवर्तनों को रोकने के लिए अद्यतन ट्रिगर की आवश्यकता नहीं होती है - जो पंक्तियों को सामान्य रूप से अपडेट करते समय कुछ "वजन" निकाल देगा।

मुझे लगता है आप coul/एक अद्यतन है दूसरी मेज पर ट्रिगर DELETE परिवर्तन को रोकने के लिए (जो सामान्य परिस्थितियों में कभी नहीं निष्पादित किया जाएगा, इसलिए "हल्के") एक दर्द की

बिट हालांकि अतिरिक्त तालिका के लिए ... सभी CreateDates - TableName, PK, CreateDate के लिए एक तालिका हो सकती है।अधिकांश डेटाबेस आर्किटेक्ट्स इससे नफरत करेंगे ...

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