क्या एक कॉलम को आसानी से बनाना संभव है?


25

मुझे उत्सुकता है अगर एक स्तंभ के साथ एक तालिका बनाना संभव है जिसे कभी नहीं बदला जा सकता है, लेकिन तालिका के अन्य कॉलम कर सकते हैं।

उदाहरण के लिए, मैं एक ऐसे CreatedByUserस्तंभ की कल्पना कर सकता हूं जिसे कभी नहीं बदलना चाहिए।

क्या इसके लिए SQL सर्वर में अंतर्निहित कार्यक्षमता है, या यह केवल ट्रिगर या कुछ और के माध्यम से संभव है?


मेरा मानना ​​है कि ट्रिगर को लागू करने के अलावा इसके अलावा कोई रास्ता नहीं है और केवल प्रक्रियाओं के माध्यम से बयान बनाने / अपडेट करने / हटाने की अनुमति है।
मार्क एस रासमुसेन


@MartinSmith धन्यवाद, लिंक के लिए। मुझे लगता है कि मेरे सवाल का जवाब होगा। इसलिए इसे एक उत्तर दें और मैं इसे स्वीकार करूंगा।
फिलिप एम

जवाबों:


19

कोई गैर updatable स्तंभों के लिए घोषणात्मक समर्थन में बनाया गया है (विशिष्ट के अलावा इस तरह के रूप में परिभाषित किया गया मामलों पूर्व IDENTITY)

इस कनेक्ट आइटम ने इसे अनुरोध किया लेकिन अस्वीकार कर दिया गया था। अपरिहार्य स्तंभ मानों को लागू करने के लिए DRI जोड़ें

एक UPDATEट्रिगर संभवतः इसे प्राप्त करने का सबसे मजबूत तरीका होगा। यह जाँच कर सकता है IF UPDATE(CreatedByUser)और एक त्रुटि उठा सकता है और यदि सही है तो लेन-देन को रोलबैक कर सकता है।


: वर्ष कनेक्ट अनुरोध आइटम पर Archive.org लिंक ऊपर लिंक web.archive.org/web/20130402211121/http://connect.microsoft.com/...
Anssssss

7

मैंने मार्टिन स्मिथUPDATE TRIGGER द्वारा दिए गए दृष्टिकोण का अपना कार्यान्वयन इस प्रकार किया है:

CREATE TRIGGER trgAfterUpdateAsset ON dbo.Asset
FOR UPDATE AS
IF UPDATE(AssetTypeID) AND EXISTS (SELECT * FROM inserted i JOIN deleted d ON i.ID = d.ID WHERE i.AssetTypeID <> d.AssetTypeID)
BEGIN 
    RAISERROR ('AssetTypeID cannot change.', 16, 1);
    ROLLBACK TRAN
END     

(नोट: तालिका में एक प्राथमिक कुंजी स्तंभ है, जिसे आईडी कहा जाता है)।

यदि AssetTypeID का मान बदलता है तो मैं केवल अपडेट को अस्वीकार कर रहा हूं। तो कॉलम अपडेट में मौजूद हो सकता है, और यदि मान नहीं बदला, तो इससे गुजरना होगा। (मुझे इस तरह की आवश्यकता थी)


1
यदि किसी विशेष रिकॉर्ड के लिए AssetTypeIDइसे गैर-शून्य मान पर सेट किया गया है और आप चलाते हैं UPDATE Asset SET AssetTypeID = NULL WHERE Asset = the_idकि कोई रोलबैक नहीं होगा क्योंकि WHERE i.AssetTypeID <> d.AssetTypeIDट्रिगर में उस स्तंभ संपादन योग्य को छोड़कर झूठ का मूल्यांकन किया जाएगा।
क्रिस्टियान वेस्टरबेक

3

आप व्युत्पन्न स्तंभ के साथ एक दृश्य का उपयोग कर सकते हैं। इसे इस्तेमाल करे

create table ro_test(id int primary key, CreatedByUser int)
go
create view v_ro_test
as
select id, CreatedByUser*1 CreatedByUser from ro_test
go

insert into ro_test values(1,10);
update ro_test
set CreatedByUser =11
where id =1;
select * from v_ro_test;
go
--ERROR--
update v_ro_test
set CreatedByUser =10
where id =1;

--BUT--
update v_ro_test
set id =2
where id =1;
select * from v_ro_test;

मुझे नहीं पता तुम्हारा क्या मतलब है। क्या आप विस्तार से समझा सकते हैं?
फिलिप एम

लेकिन आप सिर्फ तालिका को अपडेट कर सकते हैं और इसे बदल सकते हैं
फिलिप एम

1
@Philipp M लेकिन आप तालिका तक पहुंच रद्द कर सकते हैं और इसे दृश्य को दे सकते हैं। क्या वह ऐसा नहीं?
msi77

-3

आप बनाए गए कॉलम को अपडेट क्यों कर रहे हैं?

मेरे पास दो कॉलम होंगे एक [बनाया_बाई] और एक [संशोधित_बाय] कॉलम, जहां पहला इंसर्ट रिकॉर्ड में सभी संबंधित कॉलमों को सम्मिलित करेगा, और किसी भी बाद के अपडेट बस [संशोधित_बीवाई] कॉलम (एप्लिकेशन में ट्रिगर के माध्यम से) को अपडेट करेगा परत आप अपने अपडेट को केवल अपने संबंधित कॉलम के साथ [संशोधित_बी] बदलने के लिए कर सकते हैं)


3
मुझे लगता है कि आप प्रश्न के बिंदु से चूक गए हैं। यह पूछ रहा था कि क्या वास्तव में लागू करने के लिए समर्थन में कोई निर्माण किया गया था जो स्तंभ को अद्यतन करने योग्य नहीं होना चाहिए ।
मार्टिन स्मिथ

@MartinSmith सटीक रूप से - हमारे पास एक संशोधित कॉलम भी है और मैं केवल इस बारे में उत्सुक था कि क्या रीड
फिलिप एम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.