it-swarm-eu.dev

Jak mohu vypnout SCHEMABINDING pro pohled, aniž bych jej znovu vytvořil?

Jak mohu vypnout SCHEMABINDING pro pohled, aniž bych ho znovu vytvořil?

22
garik

Ano. Je dobré, že používáte SCHEMABINDING (vždy děláme) a někdy jej musíte odstranit, abyste mohli změnit závislý objekt. Jen ALTER view

ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO
11
gbn

Nedovolí vám ALTER VIEW to udělat? Když vytvoříte pohled, uděláte to takto:

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO

tak ztratit klauzuli WITH:

ALTER VIEW viewname
AS
SELECT stmt
GO

Viz ALTER VIEW na MSDN

7
SQLRockstar

Poté, co jsem se celé hodiny rozhlížel, vytvořil jsem pro to 2 uložené proc. Doufám, že to někomu pomůže

CREATE PROCEDURE ViewRemoveSchemaBinding
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)

    SELECT @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName));
    SET @PositionShemaBinding = CHARINDEX('WITH SCHEMABINDING', @Command)

    IF NOT @PositionShemaBinding = 0 BEGIN
        -- WITH SCHEMA BINDING IS PRESENT... Let's remove it !
        SET @Command = STUFF(@Command, CHARINDEX('WITH SCHEMABINDING', @Command), LEN('WITH SCHEMABINDING'), '');
        SET @Command = REPLACE(@Command, 'CREATE VIEW', 'ALTER VIEW');

        EXECUTE sp_executesql @Command
    END
END

A dát SCHEMABINDING:

CREATE PROCEDURE ViewAddSchemaBinding
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)
    DECLARE @ObjectName VARCHAR(MAX)

    SELECT  @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName)),
            @ObjectName = OBJECT_NAME(OBJECT_ID(@ViewName));

    SET @PositionShemaBinding = PATINDEX('%WITH SCHEMABINDING%', @Command)

    IF @PositionShemaBinding = 0 BEGIN
        -- WITH SCHEMA BINDING IS NOT PRESENT... Let's add it !
        SET @Command = REPLACE(@Command, 'CREATE VIEW', 'ALTER VIEW');

        -- IF OBJECT NAME IS INTO BRAKETS, We need to handle it
       IF NOT CHARINDEX('[' + @ObjectName + ']', @Command) = 0 BEGIN
           SET @ObjectName = '[' + @ObjectName + ']'
       END

       SET @Command = STUFF(@Command, CHARINDEX(@ObjectName, @Command), LEN(@ObjectName), @ObjectName + ' WITH SCHEMABINDING ');

        EXECUTE sp_executesql @Command
    END
END

Poskytuje se „tak, jak je“ ...

6
boblemar

Tato verze ViewRemoveSchemaBinding funguje, i když byl pohled od svého vytvoření přejmenován. (Problém je v tom, že pokud byl pohled přejmenován, OBJECT_DEFINITION () stále vrátí definici používající staré jméno.)

CREATE PROCEDURE [dbo].[ViewRemoveSchemaBinding]
    @ViewName VARCHAR(MAX)
AS
BEGIN
    DECLARE @PositionShemaBinding INT
    DECLARE @Command NVARCHAR(MAX)

    SELECT @Command = OBJECT_DEFINITION(OBJECT_ID(@ViewName));
    SET @PositionShemaBinding = CHARINDEX('WITH SCHEMABINDING', @Command)

    IF NOT @PositionShemaBinding = 0 BEGIN
        SET @Command = 'ALTER VIEW ' + @ViewName + ' ' + RIGHT(@Command, LEN(@Command) - @PositionShemaBinding + 1);

        EXECUTE sp_executesql @Command
    END
END

Zdá se, že po spuštění tohoto přejmenování problém zmizí, a tak ViewAddSchemaBinding není třeba měnit ....

2
David Roodman