如何为SQL Server中被SQL视图使用的表设置约束,避免底层变更影响视图
SQL Server 防止底层表Schema变更影响视图的落地方案
- 核心方案:给视图开启 SCHEMABINDING(架构绑定)
SCHEMABINDING 会将视图与依赖的底层表、列做强绑定,只要视图未删除,底层表中被视图引用的列无法执行删除、改名、修改数据类型等操作,变更请求会直接被SQL Server拦截报错。创建带架构绑定的视图语法如下,注意必须明确指定所有对象的架构名(例如下方的dbo),不允许使用SELECT *:CREATE VIEW dbo.你的核心看板视图 WITH SCHEMABINDING AS -- 必须明确指定需要的列,禁止写SELECT * SELECT t1.id, t1.order_no, t2.user_name, t2.mobile FROM dbo.订单表 t1 INNER JOIN dbo.用户表 t2 ON t1.user_id = t2.id - 权限隔离约束
给看板调用的业务账号仅开放该视图的SELECT权限,完全不授予底层表的DDL、DML操作权限,从权限层面减少非预期的底层表Schema变更风险。 - Schema变更流程前置校验
在企业内部的DDL变更审批流程中增加规则:只要待变更的表存在绑定了SCHEMABINDING的视图依赖,必须先评估对关联视图、看板的影响,补充视图适配逻辑后才能执行变更。 - DDL触发器兜底防护
可以额外创建数据库级别的DDL触发器,监控所有表的ALTER、DROP操作,一旦检测到操作的表是你核心视图的依赖表,直接回滚操作并抛出告警,示例代码如下:CREATE TRIGGER Prevent_Alter_View_Dependency_Tables ON DATABASE FOR ALTER_TABLE, DROP_TABLE AS BEGIN DECLARE @ModifiedTableName SYSNAME = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME') -- 检查被修改的表是否是核心视图的依赖表 IF EXISTS ( SELECT 1 FROM sys.sql_expression_dependencies WHERE referencing_id = OBJECT_ID('dbo.你的核心看板视图') AND referenced_entity_name = @ModifiedTableName ) BEGIN RAISERROR('当前表被核心业务看板视图依赖,禁止直接修改/删除表结构', 16, 1) ROLLBACK TRANSACTION END END
注意:如果确实需要调整底层表被视图引用的列,只需要先执行
ALTER VIEW 你的视图名 WITH SCHEMABINDING OFF解除绑定,调整完表结构、验证视图逻辑无误后,再重新开启SCHEMABINDING即可。
内容的提问来源于stack exchange,提问作者question.it
相关产品推荐
相关产品推荐

