ฉันจะปิดSCHEMABINDING
สำหรับมุมมองโดยไม่สร้างใหม่ได้อย่างไร
ฉันจะปิดSCHEMABINDING
สำหรับมุมมองโดยไม่สร้างใหม่ได้อย่างไร
คำตอบ:
ใช่. เป็นเรื่องดีที่คุณใช้ SCHEMABINDING (เราดำเนินการเสมอ) และบางครั้งคุณต้องลบมันออกเพื่อเปลี่ยนวัตถุที่ต้องพึ่งพา เพียงแค่เปลี่ยนมุมมอง
ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO
ALTER VIEW จะไม่อนุญาตให้คุณทำสิ่งนี้หรือไม่ เมื่อคุณสร้างมุมมองคุณจะทำ:
CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO
ดังนั้นแพ้ด้วยคำสั่ง:
ALTER VIEW viewname
AS
SELECT stmt
GO
หลังจากดูไปหลายชั่วโมงฉันได้สร้าง proc ที่เก็บไว้ 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
และเพื่อวางแผนงาน:
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')))