Sql server 是否仅向SQL Server中的表追加以记录不可变事件并提高总体性能?

Sql server 是否仅向SQL Server中的表追加以记录不可变事件并提高总体性能?,sql-server,Sql Server,我需要在SQL Server表中记录不可变事件。如何实现以下目标 将表标记为仅附加 防止对每个人的表进行类似于1的编辑 允许删除特定用户的表 不锁定表中的附件 计算要用作辅助索引的varchar 255的哈希 提高读、写和索引性能 尝试这样做是否有性能优势或潜在的副作用 请注意,该问题是从非sql专家的角度提出的,因此某些项目可能会重叠 将表标记为仅附加 防止对每个人的表进行类似于1的编辑 允许删除特定用户的表 如果您不想使用应用程序级安全性,或者因为您将直接连接到数据库而不是通过服务连接到数据

我需要在SQL Server表中记录不可变事件。如何实现以下目标

将表标记为仅附加 防止对每个人的表进行类似于1的编辑 允许删除特定用户的表 不锁定表中的附件 计算要用作辅助索引的varchar 255的哈希 提高读、写和索引性能 尝试这样做是否有性能优势或潜在的副作用

请注意,该问题是从非sql专家的角度提出的,因此某些项目可能会重叠

将表标记为仅附加 防止对每个人的表进行类似于1的编辑 允许删除特定用户的表 如果您不想使用应用程序级安全性,或者因为您将直接连接到数据库而不是通过服务连接到数据库而不合适,请使用SQL Server的安全性来实现这一点

在数据库中为每种类型的用户创建一个数据库角色。创建一个追加角色,授予该角色INSERT并选择它是否适合表的权限。创建一个删除角色,授予该角色Delete并选择和插入(如果该角色对表具有合适的权限)。然后,将登录添加到服务器和数据库中的关联用户,并将数据库角色分配给创建的用户。登录名只能是公共内置角色的成员。现在,用户被安全屏蔽了

没有方法使表实际上只追加。具有db_owner角色的用户将始终能够从表中更新或删除。您可以创建替代更新触发器,但db_owner中的用户始终可以禁用该触发器。如果系统管理员登录或db_所有者用户是恶意的,则无法阻止他们更新表。他们可以接受您拒绝的权限并禁用您设置的安全措施

不锁定表中的附件 确保在创建表上的所有索引时启用了ALLOW_ROW_LOCKS=on和/或ALLOW_PAGE_LOCKS=on。这应该消除几乎所有的表锁,因为查询引擎可以使用行级锁定或页级锁定

除此之外,您无法完全消除插件上的锁定。锁是数据库确保原子性和并发性的方式。也就是说,我想不出多个INSERT语句会单独导致死锁的情况,但一旦合并DELETE语句,死锁就会发生

计算要用作辅助索引的varchar 255的哈希 您想维护自己的索引吗?为什么这很重要?如果它是由外部应用程序生成的校验和,那么我希望该字段只是表中的另一个数据字段,数据库中有一个索引

如果希望数据库以多种方式索引数据,正确的方法是根据需要运行的查询在数据库中创建多个索引

如果您想通过创建列并使用RDBMS中的函数填充值来复制索引的效果,以便您可以搜索它,那么我想您可以使用校验和或哈希字节,但我觉得这是一个有问题的设计,可能会有性能问题

你是说你想创建一个类似的网站吗

提高读、写和索引性能 关于这个主题,有数百本技术手册。有一些顾问和专家,他们的薪水很高,只是为了每天回答这个问题。太宽了。它取决于服务器内存、磁盘、CPU、网络、应用程序、生成的数据量、存储的数据量、数据的时间敏感性、并发用户数、插入数据的方式、查询数据的方式等

这就像问一个桥梁工程师,我怎样才能确保我要建造的桥梁不会倒塌

最好的办法是成为一名桥梁工程师


此网站可以帮助解决性能问题的特定实例。

[1,2,3]除非白名单中指定了用户,否则您可以创建回滚更新和删除的触发器。或者不授予表本身的访问权限,并用存储过程覆盖它。您可以根据需要设置权限。计算散列也可以在SP或触发器内部完成。4,6比你想象的更狡猾,你想回答“我需要…”的要求还是列表?它们是不同的,两者之间没有联系。列表不是你需要满足的需求。你的六个问题中的每一个都可能会很长,以便得到足够的回答。这对于一个在线论坛来说实在是太宽泛了。我建议把你的问题分开。我怀疑很多人是否愿意花足够的时间在这里为你的问题写一个完整的答案。@lad2025用了三行文字做了大部分,请看
[GreenPlumb]对于存储选项=value和@Paulo这两个部分来说,这两个部分结合得非常好,也是一个具有挑战性的问题@Sean see@user5276926太好了,您标记了MS SQL Server并显示了GreenPlumb数据库中的文档