如何隐藏/禁用表而不删除表以检查冗余?


12

我必须维护和扩展一个旧的旧系统,其中包含不再使用的Web服务方法和数据库表。由于我不能完全确定这些表是否确实是多余的,因此恐怕会删除它们。

还有其他方法可以达到相同的效果(不能再使用表)而不删除它们吗?我的想法是将它们Deleted从当前的默认设置转移到其他模式(例如)dbo

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;

架构方法是否还有其他选择或有任何缺点?

Answers:


7

是否有其他方法可以达到相同目的(不能再使用表)而不删除它们?

模式更改是一项非常快速的操作-仅需更改元数据。我最初的想法来自Aaron Bertrand的博客-Schema Switch-A-Roo

您可以在这里按照我的回答中的步骤进行操作

显然,还有其他方法,例如sp_rename N'old table',N'new table'或只是拒绝对该表的权限。


我不确定我应该接受什么答案,因为所有答案都对您有帮助。我不知道亚伦的文章,所以我接受了它,因为它包含更多信息(即使仅链接)。
蒂姆·施密特

@TimSchmelter很高兴您发现它很有用。在这里重复文章或我的答案(链接)没有意义。这就是为什么我引用了它。
金莎(Kin Shah)

12

还有两个其他选项可以重命名表,或者如果它们具有聚集索引,则可以禁用聚集索引。


谢谢。我不知道禁用聚簇索引会使表不可用。这些方法(+模式)的优缺点是什么?
蒂姆·施密特

5
@TimSchmelter禁用CI的一个缺点是要再次启用CI,您需要重建索引。另一种选择是拒绝表对公共角色的权限,尽管数据库所有者或系统管理员仍将看到它们,也可能通过所有权链接。
马丁·史密斯

在删除表或从表中删除列之前,我经常通过在名称末尾添加“ _deprecated”或类似名称来对其进行重命名。然后,如果没有错误,则必须没有引用它的任何内容。
杰伊

权限更改是偶然的。如果运行某个应用程序的服务帐户是dbo,或者甚至是更差的sysadmin,则它将完全忽略任何类型的DENY。希望他们不是,但这确实发生了。
肯尼斯·费舍尔

6

从[可能]使用的角色/组/帐户中删除表上的权限

如果有任何爆炸,请将其[快速]放回原处。

提示:使用脚本进行这些更改将是一个非常非常好的主意。


就像在非生产数据库上进行测试一样。;)希望这对OP很明显。
jpmc26 2016年

@ jpmc26。我将首先在非生产数据库中进行测试。但是问题是我想知道是否从外部使用功能或数据库对象(不仅通过webservice方法,而且直接在公司其他位置的数据库或管理工具上)。
蒂姆·施密特

嗯 如果您正在寻找DBA的直接DB访问,听起来好像日志记录是正确的。在手工操作中,产品和非产品中使用的可能性不太可能相同。我不确定要记录这些操作有多么容易,但是如果您有登录产品,则可以对其进行分析以查找用法。
jpmc26

@ jpmc26:可以的是,如果这些管理员掉在他们的脸上,他们会报告。客户不满意,但是可以在推出之前在测试系统上进行检查。
蒂姆·施密特

3

删除权限通常无法正常进行,因为您不能确定某人没有权限。可能是通过组,角色甚至是因为他们是sysadmin(尽管我们希望不是)。

对于表,您可以禁用它们。这是一个快速的过程。但是,要启用它们,您需要重建它们,并且需要一个很大的表,这可能会花费您相当长的时间。

最好的选择是将对象移动到新的架构(如您建议的那样)或重命名该对象。这两个操作都可以快速简便地完成和撤消。权限也将保持双向。

您可以采取的另一步骤是在对象的扩展属性中添加“ TBD注释” 。您可以记下所做更改的时间,和/或可以记下为何感到安全的摆脱记号。

所有这些都表明我将运行扩展事件会话(或事件探查器跟踪)几天,以确保您拥有所有正在使用的对象。您可以将会话严格限制为仅包含对象名称和对象名称,以减少开销。另外,请确保您在月末或季度末的任一天都运行了几天,以确保一切就绪。


3

按照Phil W.的建议删除权限。

还从使用表的任何存储过程中删除权限。在SQL Server中,(我不知道其他人)权限从调用对象(例如存储过程)链接到被调用对象(例如表)。


任务是让所有试图访问这些表的工具,函数,对象,查询(甚至在远程数据库中)都失败。如果我必须修改存储过程,我已经必须知道它在使用它。还是有任何简单的方法来确定存储过程使用了表?
蒂姆·施密特

我不建议修改存储过程,只删除它的EXECUTE权限。如您所说,很容易在必要时恢复权限。您可以查看存储过程使用了哪些表:在SQL Server Management Studio的对象资源管理器中,选择数据库->可编程性->存储过程。右键单击存储名称,然后选择“查看依赖关系”。选择[过程名称]所依赖的对象。
彼得·比尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.