একটি কলাম কেবল পঠনযোগ্য করে তৈরি করা সম্ভব?


25

আমি কৌতূহল, যদি কোনও কলাম দিয়ে কোনও টেবিল তৈরি করা সম্ভব হয় যা কখনই পরিবর্তন করা যায় না, তবে টেবিলের অন্যান্য কলামগুলি এটি করতে পারে।

উদাহরণস্বরূপ আমি এমন একটি CreatedByUserকলাম কল্পনা করতে পারি যা কখনই পরিবর্তন করা উচিত নয়।

এর জন্য কি এসকিউএল সার্ভারে অন্তর্নির্মিত কার্যকারিতা রয়েছে, বা এটি কেবল ট্রিগার বা অন্য কোনও কিছুর মাধ্যমেই সম্ভব?


আমি বিশ্বাস করি না ট্রিগারগুলি বাস্তবায়ন করা এবং প্রক্রিয়াগুলির মাধ্যমে বিবৃতি কেবল তৈরি / আপডেট / মুছে ফেলা ব্যতিরেকে অন্য কোনও উপায় রয়েছে।
মার্ক এস। রাসমুসেন


লিঙ্কটির জন্য @ মার্টিনস্মিত ধন্যবাদ। আমার ধারণা এটি আমার প্রশ্নের উত্তর হবে। সুতরাং এটির উত্তর দিন এবং আমি এটি গ্রহণ করব।
ফিলিপ এম

উত্তর:


19

অ-আপডেটযোগ্য কলামগুলির জন্য ঘোষিত সমর্থনে কোনও বিল্ট নেই (নির্দিষ্ট পূর্বনির্ধারিত কেস যেমন যেমন IDENTITY)

এই সংযুক্ত আইটেমটি এটির জন্য অনুরোধ করেছিল তবে তা প্রত্যাখ্যান করা হয়েছিল। অপরিবর্তনীয় কলাম মান প্রয়োগ করতে ডিআরআই যুক্ত করুন

একটি UPDATEট্রিগার সম্ভবত এটি অর্জনের সবচেয়ে মজাদার উপায়। এটি IF UPDATE(CreatedByUser)একটি ত্রুটি পরীক্ষা করে বাড়াতে এবং যদি সত্য হয় তবে লেনদেনকে রোলব্যাক করতে পারে।


পুরানো সংযোগের অনুরোধ আইটেমটির সাথে আর্কাইভ.অর্গ লিঙ্কটি উপরে লিঙ্ক করা হয়েছে: web.archive.org/web/20130402211121/http://connect.microsoft.com/…
আনসসসেস ২

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     

(দ্রষ্টব্য: সারণীতে একটি প্রাথমিক কী কলাম রয়েছে, এটি আইডি বলে।

আমি কেবলমাত্র আপডেটটি প্রত্যাখ্যান করছি যদি অ্যাসেটটাইপআইডির মান পরিবর্তন হয়। সুতরাং কলামটি একটি আপডেটে উপস্থিত থাকতে পারে এবং যদি মানটি পরিবর্তন না হয় তবে তার মধ্য দিয়ে যেতে হবে। (আমার এইভাবে দরকার ছিল)


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
@ ফিলিপ এম তবে আপনি টেবিলটিতে অ্যাক্সেস প্রত্যাহার করতে পারেন এবং এটিকে দর্শনে মঞ্জুর করতে পারেন। তাই না?
msi77

-3

আপনি কেন নির্মিত কলামটি আপডেট করছেন?

আমার দুটি কলাম একটি [তৈরি_বাই] এবং একটি [সংশোধিত_বি] কলাম থাকবে, যেখানে প্রথম সন্নিবেশটি রেকর্ডে সমস্ত সম্পর্কিত কলামগুলি সন্নিবেশ করায় এবং পরবর্তী যে কোনও আপডেটগুলি কেবল [পরিবর্তিত_বি] কলামটি আপডেট করবে (অ্যাপ্লিকেশনটিতে একটি ট্রিগারের মাধ্যমে) স্তরটি আপনি আপনার নিজের স্তরের সাথে [পরিবর্তিত_বি] পরিবর্তন করার জন্য আপনার আপডেটটি গঠন করতে পারেন


3
আমি মনে করি আপনি প্রশ্নের বিন্দুটি মিস করেছেন। এটি জিজ্ঞাসা করছিল যে কলামটি আপডেটযোগ্য হবে না তা সুনির্দিষ্টভাবে প্রয়োগ করতে সমর্থনের কোনও বিল্ট আছে কিনা ?
মার্টিন স্মিথ

@ মার্টিনস্মিথ হুবহু - আমাদেরও একটি পরিবর্তিত কলাম রয়েছে এবং আমি কেবল কৌতূহলী ছিলাম যে কেবল পাঠযোগ্যভাবে সমর্থন করার জন্য একটি অন্তর্নির্মিত সমর্থন রয়েছে
ফিলিপ এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.