限制更新列

时间:2011-01-02 04:20:10

标签: sql sql-server

是否可以在不使用触发器的情况下限制更新SQL中的列?如果是这样的话? (需要查询)


PS:

我的意思是,我有一张桌子

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),
)

我需要允许用户仅更新[ExchangeRateID][IncomeAmnt_LKR]字段。所有其他字段无法更新。只插入。

4 个答案:

答案 0 :(得分:6)

使用DENY阻止更新。 e.g。

DENY UPDATE ON

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

我们仍应考虑所有权链接如何覆盖DENY,请参阅gbn's answer

答案 1 :(得分:3)

归结为权限。

根据Conrad Frix的回答你对列进行了更新。

但是,这些将被db_owner / dbo和sysadmin / sa忽略,因此您需要确保您的权限模型是正确的。

如果您有写入表的视图或存储过程,则如果相同的DB用户同时拥有代码和表,则不会检查权限。这称为ownership chaining

我提到这一切是因为2天前有另一个问题where permissions were bypassed

如果您的基于权限的方法失败并且您不能/不会更改它,那么您将需要使用触发器

答案 2 :(得分:1)

使用该表创建一个视图并隐藏您想要的列。并将该视图提供给用户。

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

答案 3 :(得分:0)

从该表格制作视图,然后隐藏您需要的列,同时让用户访问该视图