保护存储过程免受架构更改

问题描述 投票:0回答:1

我想保护 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”

我怎样才能最好地保护这个程序以避免错误?

sql-server t-sql testing stored-procedures constraints
1个回答
0
投票

一般情况下是不可能的。

您的程序可以在运行时计算所需的列。所以没有办法静态分析它需要哪些数据库结构。

你可以手动将过程绑定到某些结构(alter table上的一些智能触发器),这样当这些结构被修改/删除时你就会得到错误。但这是重复(容易出现人为错误),而且工作量很大。

无论上述情况如何,您都应该进行一些测试,以确保您的软件按预期工作。其中一项测试应该在某个时刻触发该程序。那么你的测试就失败了,阻止你提交/合并错误的代码。通常没有其他办法,只是运行时工具比静态分析更强大

© www.soinside.com 2019 - 2024. All rights reserved.