SQL:“写保护”数据行可能吗?

时间:2009-10-27 16:25:02

标签: sql sql-server sql-server-2005 tsql

可能是一个愚蠢的问题,但是我可以保护SQL Server数据库中的一行数据在不设置用户权限的情况下被删除或更新吗?

这是针对默认值的默认值?

由于

6 个答案:

答案 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,等)