2011-01-02 15 views
1

Ist es möglich, das Aktualisieren einer Spalte in SQL einzuschränken, ohne einen Trigger zu verwenden? Wenn das so ist, wie ? (Müssen Sie die Abfrage)Update einschränken Spalte


PS:

Ich meine, ich habe eine Tabelle

CREATE TABLE MYBUDGET.tbl_Income 
(
    [IncomeID]   INT    NOT NULL IDENTITY(1,1), 
    [IncomeCatID]  INT    NOT NULL, 
    [IncomeAmnt]  MONEY   NOT NULL, 
    [IncomeCurrencyID] INT    NOT NULL, 
    [ExchangeRateID] INT    NOT NULL, 
    [IncomeAmnt_LKR] MONEY   NOT NULL, 
    [AddedOn]   DATETIME  NOT NULL, 
    [Remark]   VARCHAR(250), 
) 

ich brauche, damit die Benutzer nur [ExchangeRateID] und [IncomeAmnt_LKR] Felder aktualisieren. Alle anderen Felder können nicht aktualisiert werden. nur einfügen.

+0

Beschränken, wie? Update verbieten, oder eher auf eine Reihe von Werten beschränken? – ramn

Antwort

6

Verwenden DENY Update zu blockieren geben. z.B. Es kommt auf den Berechtigungen

DENY UPDATE ON 

MYBUDGET.tbl_Income 
(
    [IncomeID], 
    [IncomeCatID], 
    [IncomeAmnt]  , 
    [IncomeCurrencyID] , 
    [AddedOn]   , 
    [Remark] 
) 
TO Mary, John, [Corporate\SomeUserGroup] 

Man sollte immer noch überlegen, wie Verkettungs Eigentum außer Kraft setzen kann das Denys gbn's answer

+1

Wie für alle Benutzer zu verweigern? – Sency

+0

In der TO-Klausel 'TO Public' wird es den Trick geben. –

+0

Dies ist die richtige Antwort, wenn der Ansatz in Triggern ist! – Sudantha

1

Erstellen Sie eine Ansicht mit der Tabelle und blenden Sie die gewünschte Spalte aus .. und gewähren Sie den Benutzern Zugriff auf diese Ansicht.

CREATE VIEW view_name AS 
SELECT column_name(s) 
FROM table_name 
WHERE condition 
+0

Gemäß der anderen Antwort, die eine Ansicht vorschlägt, hindert dies einen autorisierten Benutzer nicht daran, ** die Spalten in der zugrunde liegenden Tabelle ** zu aktualisieren, was das OP verhindern möchte. – slugster

0

Sie einen Blick von der Tabelle und dann verdunkeln Sie die Spalte benötigen, auch die Benutzer Zugang dieser VIEW

+0

Dies verhindert nicht, dass ein autorisierter Benutzer ** die Spalten in der zugrunde liegenden Tabelle ** aktualisiert, es verhindert einfach, dass nicht berechtigte Benutzer diese Spalten sehen. – slugster

3

sehen.

Sie DENY UPDATE auf den Spalten nach Conrad Frix Antwort.

Diese werden jedoch mit db_owner/dbo und sysadmin/sa ignoriert. Sie müssen also sicherstellen, dass Ihr Berechtigungsmodell korrekt ist.

Wenn Sie Ansichten oder gespeicherte Prozeduren haben, die in die Tabelle schreiben, werden die Berechtigungen auch dann nicht überprüft, wenn die gleichen DB-Benutzer sowohl Code als auch Tabelle besitzen. Dies ist bekannt als ownership chaining

ich das alles erwähnen, weil es eine andere Frage 2 Tage war vor where permissions were bypassed

Wenn Ihr berechtigungsbasierte Ansatz scheitert und man kann nicht/wird es nicht ändern, dann werden Sie brauchen Trigger verwenden

+1

+1 Guter Punkt bezüglich der Besitzverkettung. –