首页 > 解决方案 > 使数据库表暂时只读(并且不引发错误)

问题描述

在我们的软件中,我们在 Microsoft SQL-Server(2008 R2 到 2019)上托管的数据库表内有类似缓存。现在我必须调试一些仅在缓存为空时才运行的代码行。否则数据来自缓存,我需要调试的代码不会运行。

由于我厌倦了在再次调试之前总是手动删除此缓存表的内容,因此我正在寻找一种方法使此缓存表只读一段时间。

我无法更改实际将数据写入此缓存表的代码,因此我正在寻找一种仅使用 SQL Management Studio 来实现目标的方法,最好是运行 TSQL 脚本来打开只读-能力和另一个脚本再次将其关闭。

谷歌搜索我找到了几种方法来实现这一点,但不幸的是,我搜索的所有方法都会引发错误,这会阻止我们的软件运行。

我首选的解决方案是在我的缓存表上触发,如下所示:

CREATE TRIGGER CacheNoInsert ON CacheTable
INSTEAD OF INSERT, UPDATE, DELETE
AS
BEGIN
    ROLLBACK TRANSACTION
END

但是这个触发器引发了一个错误。ROLLBACK TRANSACTION并在语法错误中删除结果。

那么,有没有办法改变这个触发器不引发错误?或者有没有其他方法可以实现我的目标而不会出错?

标签: sql-servertsql

解决方案


没关系,我想我找到了解决方案。删除并在它们ROLLBACK TRANSACTION之间放置一段无意义的代码行就可以了。BEGINEND

CREATE TRIGGER CacheNoInsert ON CacheTable
INSTEAD OF INSERT, UPDATE, DELETE
AS
BEGIN
    PRINT 'doesntMatter'
END

但我希望事务仍然可以通过提交或回滚来删除。


推荐阅读