vst*_*ien 4 sql-server sql-server-2012
出于报告目的,我需要能够在列级别(通过sys.sql_expression_dependencies)查询视图和基础表之间的依赖关系。
让 SQL Server 存储引用列的一种方法是使用架构绑定视图。由于我的一些用户也会创建视图,我想强制执行这些。据我所知,不可能只允许在 SQL Server 数据库中创建具有模式绑定的视图(尽管这对我来说似乎是合法的要求)。
是否有其他方法可以强制 SQL Server 跟踪哪些列被哪些视图引用?或者是否有一种隐藏的方法可以在 SQL Server 中强制执行架构绑定视图?
使用数据库上的 DDL 触发器非常容易:
CREATE TRIGGER RequireSchemaBinding ON DATABASE FOR CREATE_VIEW, ALTER_VIEW
AS
DECLARE @object nvarchar(max)
DECLARE @schema nvarchar(max)
SET @object = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)')
SET @schema = EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'nvarchar(max)')
IF ISNULL(OBJECTPROPERTY(OBJECT_ID(QUOTENAME(@schema) + '.' + QUOTENAME(@object)), 'IsSchemaBound'), 0) = 0
BEGIN
RAISERROR('Not today, punk.', 16, 1)
ROLLBACK TRANSACTION
END
Run Code Online (Sandbox Code Playgroud)
您可以为此使用 DDL 触发器。不幸的SCHEMABINDING是,它不是EVENTDATA结构中的属性,因此您必须构造对象名称并使用它检查属性:
CREATE TRIGGER EnforceViewBinding
ON DATABASE
FOR CREATE_VIEW, ALTER_VIEW
AS
DECLARE @xml xml = EVENTDATA();
DECLARE
@Name sysname =
QUOTENAME(@xml.value('(./EVENT_INSTANCE/SchemaName)[1]', 'sysname')) +
N'.' +
QUOTENAME(@xml.value('(./EVENT_INSTANCE/ObjectName)[1]', 'sysname'));
IF OBJECTPROPERTYEX(OBJECT_ID(@Name, N'V'), 'IsSchemaBound') = 0
BEGIN
RAISERROR ('Views must specify the WITH SCHEMABINDING option.', 16, 1);
ROLLBACK;
END;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |