是否可以在不使用触发器的情况下限制更新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]
字段。所有其他字段无法更新。只插入。
答案 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)
从该表格制作视图,然后隐藏您需要的列,同时让用户访问该视图