답변:
예. SCHEMABINDING (항상 사용)을 사용하는 것이 좋으며 때로는 종속 객체를 변경하기 위해 제거해야합니다. 그냥 ALTER보기
ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO
ALTER VIEW를 사용하면이 작업을 수행 할 수 없습니까? 뷰를 만들 때 다음을 수행하십시오.
CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO
따라서 WITH 절을 잃어 버리십시오.
ALTER VIEW viewname
AS
SELECT stmt
GO
MSDN에서 ALTER VIEW를 참조하십시오.
몇 시간 동안 둘러 본 후 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
"있는 그대로"제공됩니다 ...
이 버전의 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을 변경할 필요가없는 것 같습니다.
RIGHT
과 같이 변경하십시오 .RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))