可能是一个愚蠢的问题,但是我可以保护SQL Server数据库中的一行数据在不设置用户权限的情况下被删除或更新吗?
这是针对默认值的默认值?
由于
答案 0 :(得分:2)
通过关系完整性来做这件事 - 做 NOT 使用触发器,因为事后总是很难维护(他们有自己的位置,而不是在这里)。关系完整性将完成您所需的一切。
使用关系完整性可能非常优雅,但您需要做的是略微反直觉,因此很容易错过。
使用数字主键创建主表table tblMain。为简单起见,我使用一个包含一列intID的表对此进行了测试,并使用值0,1和2填充它。
接下来使用类似的数字主键创建第二个表tblGuard。我在这个表中添加了一行,值为1。
现在反向逻辑位。在 tblGuard 表上创建一个引用tblMain表的外键
ALTER TABLE [dbo].[tblGuard] ADD
CONSTRAINT [FK_tblGuard_tblMain] FOREIGN KEY
(
[intID]
) REFERENCES [dbo].[tblMain] (
[intID]
)
约束将确保无法从tblMain表中删除intID值为1的行,因为tblGuard表引用完整性要求tblMain中存在值1。这适用于删除和截断。
答案 1 :(得分:1)
如果更新或删除该行,您可以创建一个引发错误的触发器。
答案 2 :(得分:1)
我曾经使用的一种可能的方法在我的博客文章中描述:
“假设您需要强制执行以下业务规则:在您开始处理合同之后无法更改合同(让我们假设该特定业务在完美世界中运行)。您可以使用ROWVERSION列,持久化计算一个,以及实现此规则的外键约束 - Using ROWVERSION to enforce business rules
答案 3 :(得分:0)
假设你的MyTable在主要版本上。
将第一行放入新表MyTableReadOnly,将该表移动到它自己的文件组,并使文件组只读。
从MyTable中删除第一行
现在创建一个
的视图SELECT Columns From MyTableNew
UNION
SELECT Columns From MyTable
通过视图访问所有内容。如果要从视图中更新或删除,可以在MyTable上执行此操作,并忽略MyTableNew的任何内容。如果您想使用该视图,可以使用INSTEAD-OF
触发器。
答案 4 :(得分:0)
创建第二个表,其中包含与您要保护的行具有相同唯一ID的行。
根据需要允许使用SECOND表
在第一个表上添加一个触发器,如果第二个表中存在匹配的行,它将删除/更新两个表。
这样,除非您在第二个表上有烫发,否则您将无法修改“链接”行,因为触发器会因第二个表上的权限违规而终止
注意:此方法与其他主要方法(使用VIEW)的对比是,与VIEW方法不同,它允许轻松维护“固定”行集,并避免通常与视图相关的各种性能问题。
答案 5 :(得分:0)
我说“以编程方式”这样做。 例如,让id为1的行始终是默认行,然后添加到所有UPDATE或DELETE查询“WHERE id!= 1”或者使用您用于编写逻辑的任何语言(PHP,C,VB,等)