뷰를 다시 만들지 않고 SCHEMABINDING을 끄려면 어떻게합니까?


답변:


11

예. SCHEMABINDING (항상 사용)을 사용하는 것이 좋으며 때로는 종속 객체를 변경하기 위해 제거해야합니다. 그냥 ALTER보기

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

나도 마찬가지 였지만 때로는 다른 객체 (함수, 뷰)가 이것에 의존합니다. 따라서이 플래그를 한동안 표시 / 표시 해제하는 것이 좋습니다 :). 따라서 현재 버전의 db에서는 불가능합니다.
garik

@ garik : 맞습니다. 나는 같은 문제가 있습니다. 각 종속 개체에 대해 ALTER를 실행합니다 ... 어느 시점에서든 SQL Server는 규칙을 시행합니다. 불일치가 발생할 수 있으므로 "스위치를 끌 수 없습니다"
gbn

8

ALTER VIEW를 사용하면이 작업을 수행 할 수 없습니까? 뷰를 만들 때 다음을 수행하십시오.

CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO

따라서 WITH 절을 잃어 버리십시오.

ALTER VIEW viewname
AS
SELECT stmt
GO

MSDN에서 ALTER VIEW를 참조하십시오.


5

몇 시간 동안 둘러 본 후 2 개의 저장 프로 시저를 만들었습니다. 이것이 누군가를 돕기를 바랍니다.

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

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

"있는 그대로"제공됩니다 ...


2

이 버전의 ViewRemoveSchemaBinding은 뷰가 작성된 이후 이름이 바뀌더라도 작동합니다. (문제는 뷰의 이름이 바뀌더라도 OBJECT_DEFINITION ()은 여전히 ​​이전 이름을 사용하여 정의를 반환한다는 것입니다.)

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

이것을 실행 한 후 이름 바꾸기 문제가 사라져서 ViewAddSchemaBinding을 변경할 필요가없는 것 같습니다.


1
명령에 여전히 'SCHEMABINDING'이 포함되어 있으므로 작동하지 않습니다.이를 수정하려면 사용법을 다음 RIGHT과 같이 변경하십시오 .RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))
Cocowalla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.