我想保护 SQL Server 存储过程免受基础表更改的影响。
正如您在下面的测试中看到的,我能够在没有警告或错误的情况下破坏此存储过程。
理想情况下,我想要一个内部 SQL Server 解决方案,其中“删除列”行由于依赖性而失败,类似于尝试删除带有外键的表。这将迫使开发人员也修复存储过程或重新考虑他们的方法。
我可以通过一些自动化测试来保护它,但感觉就像悬崖底部的救护车。
如有任何建议,我们将不胜感激。
--Create two column table with one row of data
CREATE TABLE test.testTable (c1 int, c2 int)
INSERT INTO test.testTable
VALUES (1, 2)
GO
--create procedure to return second column
CREATE PROCEDURE test.testProcedure
AS
SELECT c2
FROM test.testTable
GO
--drop second column from table. This succeeds despite the dependency in the stored procedure.
ALTER TABLE test.testTable DROP COLUMN c2
EXEC test.testProcedure
过程调用失败:
无效的列名称“c2”
我怎样才能最好地保护这个程序以避免错误?
一般情况下是不可能的。
您的程序可以在运行时计算所需的列。所以没有办法静态分析它需要哪些数据库结构。
你可以手动将过程绑定到某些结构(alter table上的一些智能触发器),这样当这些结构被修改/删除时你就会得到错误。但这是重复(容易出现人为错误),而且工作量很大。
无论上述情况如何,您都应该进行一些测试,以确保您的软件按预期工作。其中一项测试应该在某个时刻触发该程序。那么你的测试就失败了,阻止你提交/合并错误的代码。通常没有其他办法,只是运行时工具比静态分析更强大