Database design 允许用户更新表中的某些记录,但不允许更新全部记录?

Database design 允许用户更新表中的某些记录,但不允许更新全部记录?,database-design,Database Design,假设您有一个具有业务逻辑层所依赖的两个默认选项的查找表,但您希望允许用户添加/更新/删除该表中的记录。例如,将预先填充以下内容的CurrentStatus表,但允许用户更新这些记录的文本以及添加/更新/删除额外记录: ID | StatusName ------------- 1 | New 2 | Inactive ... | ... 可以采取哪些方法来实现这种灵活性?我不想“硬编码”预填充的记录,因为用户可能希望在以后重新定义它。主要着眼于SQL Server,但理想情况下,该方

假设您有一个具有业务逻辑层所依赖的两个默认选项的查找表,但您希望允许用户添加/更新/删除该表中的记录。例如,将预先填充以下内容的CurrentStatus表,但允许用户更新这些记录的文本以及添加/更新/删除额外记录:

ID  | StatusName
-------------
1   | New
2   | Inactive
... | ...

可以采取哪些方法来实现这种灵活性?我不想“硬编码”预填充的记录,因为用户可能希望在以后重新定义它。主要着眼于SQL Server,但理想情况下,该方法应独立于服务器。

这种类型的权限逻辑无法使用ms SQL Server实现,更不用说通用的rdbms了。这种类型的逻辑必须在应用程序级别强制执行

你也许可以用触发器做一些事情作为威慑,但那只能防止意外的变化

更新 SQL 2014/2016现在具有行级安全功能:


这种类型的权限逻辑无法使用ms sql server实现,更不用说通用的rdbms了。这种类型的逻辑必须在应用程序级别强制执行

你也许可以用触发器做一些事情作为威慑,但那只能防止意外的变化

更新 SQL 2014/2016现在具有行级安全功能:


最简单的方法是对该表的所有写入操作执行存储过程——您可以在存储过程的逻辑中强制执行限制。您可以将不同的权限授予存储过程和基础表,以便应用程序的用户只能通过存储过程进行更改。看

您也可以创建一个视图并通过该视图进行写操作,尽管我以前从未尝试过这种方法,所以它可能不起作用

触发器也可能起作用,尽管触发器往往会给应用程序带来额外的复杂性——所以我通常喜欢避免使用触发器

这些解决方案的核心要素是没有什么是万无一失的——一个有足够特权的坚定用户可以改变他想要的。但是,只要你能将你的应用程序约束到一个特定的用户(或一组用户),并且你能相信你的高权限用户不会用特别的查询把事情搞砸,那么你可能就没事了


当然,您还需要更改模式,以便无论您选择如何实施限制,您的代码都可以知道要限制哪些行。其他答案中推荐的“附加列”或“附加表”方法是该附加模式的两个合理选择。“附加表”方法在理论上对我来说似乎是最干净的,但可能会导致次优的查询计划,因为每个查询都需要跨两个表的并集。这是你在使用前想要测试的东西

最简单的方法是对该表的所有写入操作执行一个存储过程——您可以在存储过程的逻辑中强制执行限制。您可以将不同的权限授予存储过程和基础表,以便应用程序的用户只能通过存储过程进行更改。看

您也可以创建一个视图并通过该视图进行写操作,尽管我以前从未尝试过这种方法,所以它可能不起作用

触发器也可能起作用,尽管触发器往往会给应用程序带来额外的复杂性——所以我通常喜欢避免使用触发器

这些解决方案的核心要素是没有什么是万无一失的——一个有足够特权的坚定用户可以改变他想要的。但是,只要你能将你的应用程序约束到一个特定的用户(或一组用户),并且你能相信你的高权限用户不会用特别的查询把事情搞砸,那么你可能就没事了

当然,您还需要更改模式,以便无论您选择如何实施限制,您的代码都可以知道要限制哪些行。其他答案中推荐的“附加列”或“附加表”方法是该附加模式的两个合理选择。“附加表”方法在理论上对我来说似乎是最干净的,但可能会导致次优的查询计划,因为每个查询都需要跨两个表的并集。这是你在使用前想要测试的东西

在表中添加一个名为“只读”的字段,并在应用程序中进行检查。不允许对“只读”字段进行更新/删除。可以轻松添加新字段。简短而简单。

在表中添加一个名为“只读”的字段,并在应用程序中进行检查。不允许对“只读”字段进行更新/删除。可以轻松添加新字段。简短而简单。

有几个选项——您可以将插入/更新/删除封装在存储过程中,以检查您不希望用户覆盖的“特殊”值。对查找表的所有编辑都必须经过存储过程

另一种选择是向表中添加一列,称之为“标准”,并将其设置为“是/否”标志。如果为“是”(表示不希望用户更改的标准项),则可以轻松地禁止更新或删除。如果为否(表示这是用户创建的值),则可以允许编辑通过。这使您能够定义数据,而无需硬编码与项目ID有关的任何特殊内容。

有两个选项--您可以在存储过程中封装插入/更新/删除,以检查您不希望用户覆盖的“特殊”值。对查找表的所有编辑都必须经过存储过程

另一种选择是向表中添加一列,称之为“标准”,并将其设置为“是/否”标志。如果为“是”(表示不希望用户更改的标准项),则可以轻松地禁止更新或删除。如果为否(表示这是用户创建的值),则可以