Belirli sütunlarda güncellemeyi kısıtla. Yalnızca saklı yordamın bu sütunları güncellemesine izin ver


17

Yalnızca saklı yordam ile güncelleştirmek istediğiniz hassas fiyat sütunları var. Güncellemek için tasarlanmış saklı yordamları kullanmıyorsa, bu fiyat sütunlarındaki değerleri değiştirmek için tüm kod veya el ile denemeleri başarısız olur.

Tetikleyiciler ve bir jeton tablo kullanarak bunu uygulamayı düşünüyorum. Düşündüğüm fikir bir jeton masasına sahip olmak. saklı yordamlar önce belirteç tablosuna değerler girmelidir. Ardından fiyat sütunlarını güncelleyin. Güncelleme tetikleyicisi, jetonun güncellenen satır için jeton tablosunda olup olmadığını kontrol eder. Eğer bulunursa, devam edecekti. jeton bulunmazsa, bir istisna atar ve güncelleme işleminin başarısız olmasını sağlar.

Bu kısıtlamayı uygulamak için iyi / daha iyi bir yol var mı?


1
Sütun tabanlı güvenlik için bir görünüm kullanabilirsiniz. Bir tetikleyiciden çok daha zarif olacak. Kullanıcılara görünüm hakkında izin verin, ancak temel alınan veriler değil.
Thomas Stringer

Bu iyi bir nokta. Ancak, bağlantı havuzu kullanan birçok uygulamayı bozmadan sorun çözülmeden kalır.
Elias

Bunun nasıl "bağlantı havuzu kullanan birçok uygulamayı kırar" olacağını açıklayabilir misiniz?
Aaron Bertrand

Yanıtlar:


21

SQL Server, sütun düzeyinde izinlere izin verir. Sadece örneğin:

GRANT UPDATE ON dbo.Person (FirstName, LastName) TO SampleRole;
DENY UPDATE ON dbo.Person (Age, Salary) TO SampleRole;

Teşekkürler Michal, ama bu çözüm benim için işe yaramaz, çünkü uygulamam bağlantı havuzu kullanan bir web uygulamasıdır. Tüm kullanıcılar aynı SQL Server Bağlantı Dizesini kullanarak bağlanır.
Elias

1
@Elias anlamıyorum. Bağlantı dizesi belirli bir kullanıcı olarak bağlanır, değil mi? Yani SampleRolebu kullanıcı ile değiştir ...
Aaron Bertrand

sütun düzeyi izinleri buraya gitmenin yoludur. Bu ve geliştiricilerin t-sql ile değerlerde değişiklik yapmanın sistemi doğrudan yok edeceğini bilmesini sağlamak.
mrdenny

6
-- prevent your web app user from updating that column directly:

DENY UPDATE ON dbo.YourTable(Price) TO WebApplicationUserName;
GO

-- create a stored procedure while logged in as sysadmin:

CREATE PROCEDURE dbo.UpdateYourTable
  @ProductID INT,
  @Price DECIMAL(10,2)
WITH EXECUTE AS OWNER
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE dbo.YourTable 
    SET Price = @Price
    WHERE ProductID = @ProductID;
END
GO

-- grant explicit access only to that stored procedure to the web app user:

GRANT EXEC ON dbo.UpdateYourTable TO WebApplicationUserName;

2

Tüm kullanıcılarınız aynı girişe sahipse (ouch, BTW) başka bir seçenek var

  • söz konusu kullanıcıdan güncelleme haklarını (veya bu şekilde yapıyorsanız rolü) iptal edin.
  • Depolanan işlemi üzerinde "sahip olarak yürüt" yan tümcesi ile değiştirme
  • saklanan proc, içinde bulunduğu şemanın sahibi olan kullanıcının haklarıyla çalışır (eğer varsa, dbozaten kapsanmışsınızdır).

Normal uygulama kullanıcıları bu tabloda güncelleme haklarından yoksundur, bu yüzden başka bir şekilde güncelleyemezler.


Bunu yapmak için yeni bir kullanıcı oluşturmanıza gerek yok ...
Aaron Bertrand

@aaronbertrand haklısınız - bu nedenle, e reasonni "yaratıcı olarak yürüt" yapacağınızı düşünüyordu, ancak bu bir şey değil - şemanın sahibi olan kullanıcının haklarına sahip olduğu sürece "sahip olarak yürütebilirsiniz" bu tabloyu güncelleyin. Depolanan proc dbo içindeyse, kapsanırsınız. Cevabımı güncelleyeceğim.
SqlRyan
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.