强制模式绑定视图

vst*_*ien 4 sql-server sql-server-2012

出于报告目的,我需要能够在列级别(通过sys.sql_expression_dependencies)查询视图和基础表之间的依赖关系。

让 SQL Server 存储引用列的一种方法是使用架构绑定视图。由于我的一些用户也会创建视图,我想强制执行这些。据我所知,不可能只允许在 SQL Server 数据库中创建具有模式绑定的视图(尽管这对我来说似乎是合法的要求)。

是否有其他方法可以强制 SQL Server 跟踪哪些列被哪些视图引用?或者是否有一种隐藏的方法可以在 SQL Server 中强制执行架构绑定视图?

db2*_*db2 7

使用数据库上的 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)


Pau*_*ite 7

您可以为此使用 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)