Câu trả lời:
Vâng. Thật tốt khi bạn sử dụng SCHEMABINDING (chúng tôi luôn luôn như vậy) và đôi khi bạn phải xóa nó để thay đổi một đối tượng phụ thuộc. Chỉ cần thay đổi quan điểm
ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO
Sẽ không THAY ĐỔI cho phép bạn hoàn thành việc này? Khi bạn tạo một chế độ xem, bạn sẽ làm:
CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO
vì vậy, mất mệnh đề VỚI:
ALTER VIEW viewname
AS
SELECT stmt
GO
Sau khi tìm kiếm trong nhiều giờ, tôi đã tạo ra 2 lưu trữ cho việc này. Hy vọng điều này sẽ giúp ai đó
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
Và để đặt HỌC BỔNG:
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
Nó được cung cấp "như là" ...
Phiên bản ViewRemoveSchemaBinding này hoạt động ngay cả khi chế độ xem đã được đổi tên kể từ khi được tạo. (Vấn đề là nếu chế độ xem đã được đổi tên, OBJECT_DEFINITION () vẫn sẽ trả về một định nghĩa sử dụng tên cũ.)
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
Có vẻ như sau khi chạy vấn đề này, vấn đề đổi tên sẽ biến mất, và vì vậy ViewAddSchemaBinding không cần phải thay đổi ....
RIGHT
thành:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))