Bir sütunu salt okunur yapmak mümkün mü?


25

Asla değiştirilemeyen bir sütuna sahip bir tablo oluşturmak mümkün olup olmadığını merak ediyorum, ancak tablonun diğer sütunları olabilir.

Örneğin CreatedByUser, hiç değişmemesi gereken bir sütun hayal edebiliyorum .

Bunun için SQL Server'da yerleşik bir işlev var mı, yoksa yalnızca tetikleyicilerle veya başka bir şeyle mümkün mü?


Tetikleyicileri uygulamaktan başka bir yol olmadığı ve sadece prosedürler yoluyla ifade oluşturma / güncelleme / silme işlemine izin vermediğine inanmıyorum.
Mark S. Rasmussen


@ MartinSmith bağlantı için teşekkürler. Sanırım sorumun cevabı bu olurdu. Öyleyse cevap ver ve kabul edeceğim.
Philipp M

Yanıtlar:


19

Güncelleştirilemeyen sütunlar için yerleşik bildirim desteği yoktur (gibi belirli önceden tanımlanmış durumlar hariç IDENTITY)

Bu Bağlan öğesi talep etti ancak reddedildi. Değişmez sütun değerlerini zorlamak için DRI ekleyin

Bir UPDATEtetikleyici muhtemelen bunu başarmanın en sağlam yolu olacaktır. IF UPDATE(CreatedByUser)Bir hatayı kontrol edip kaldırabilir ve doğruysa işlemi geri alabilir.


Archive.org yukarıda bağlanan eski Connect istek öğesine bağlantı: web.archive.org/web/20130402211121/http://connect.microsoft.com/…
Anssssss

7

Martin Smith'inUPDATE TRIGGER önerdiği yaklaşımın uygulanmasını şu şekilde yaptım :

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     

(Not: Tablonun kimliği olarak adlandırılan Birincil Anahtar sütunu vardır).

Güncellemeyi yalnızca AssetTypeID değeri değişirse reddediyorum. Dolayısıyla sütun bir güncellemede bulunabilir ve eğer değer değişmediyse, geçeceğinden daha fazla. (Bu yola ihtiyacım vardı)


1
Belirli bir kayıt için AssetTypeIDboş olmayan bir değere ayarlanırsa ve UPDATE Asset SET AssetTypeID = NULL WHERE Asset = the_idgeri WHERE i.AssetTypeID <> d.AssetTypeIDdönüş olmayacağına koşarsanız , tetikleyicide false olarak değerlendirilir ve bu sütunu düzenlenebilir bırakır.
Christiaan Westerbeek,

3

Türetilmiş sütunu olan bir görünüm kullanabilirsiniz. Bunu dene

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;

Neyi kastettiğinden emin değilim. Ayrıntılı olabilir misiniz?
Philipp M

Ancak tabloyu güncelleyebilir ve değerlerini değiştirebilirsiniz
Philipp M

1
@Philipp M Ancak tabloya erişimi iptal edip görünüme verebilirsiniz. Değil mi?
msi77

-3

Neden oluşturulan sütunu güncelliyorsunuz?

İlk sütunun kayıttaki tüm ilgili sütunları ekleyeceği iki sütunlu bir [yaratılmış_by] ve [modified_by] sütunu olacaktı ve sonraki güncellemeler sadece [modifiye_by] sütunu güncelleyecekti (uygulamadaki bir tetikleyici ile) katmanınızı güncellemenizi yalnızca [modifiye_by] ile ilgili sütunlarınızla birlikte değiştirecek şekilde yapılandırabilirsiniz)


3
Sanırım sorunun noktasını özledin. Sütunun güncelleştirilebilir olmamasını tam olarak sağlamak için herhangi bir yerleşik destek olup olmadığını soruyordu .
Martin Smith

@ MartinSmith Tam olarak - aynı zamanda değiştirilmiş bir sütuna sahibiz ve yalnızca salt okunur bir desteğin var olup olmadığını merak ediyordum
Philipp M
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.