উত্তর:
হ্যাঁ. এটি ভাল যে আপনি স্কেমবাইন্ডিং ব্যবহার করেন (আমরা সবসময় করি) এবং কখনও কখনও আপনাকে কোনও নির্ভরযোগ্য অবজেক্ট পরিবর্তন করতে এটি সরিয়ে ফেলতে হয়। শুধু ALTER দৃশ্য
ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO
বিকল্পটি কী আপনাকে এই কাজটি করার অনুমতি দেবে না? আপনি যখন একটি ভিউ তৈরি করেন আপনি তা করবেন:
CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO
সুতরাং, দফাটি সহ হারাবেন:
ALTER VIEW viewname
AS
SELECT stmt
GO
ঘন্টার পর ঘন্টা দেখার পরে, আমি এটির জন্য 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
এটি "যেমন আছে" সরবরাহ করা হয় ...
ভিউআরমোভেচেমি বাইন্ডিংয়ের এই সংস্করণটি দৃশ্যটি তৈরি করার পর থেকে নতুন নামকরণ করা হলেও তা কাজ করে। (সমস্যাটি হ'ল যদি ভিউটির নতুন নামকরণ করা হয়, তবে 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
দেখে মনে হচ্ছে এটি চালানোর পরে পুনরায় নামকরণের সমস্যাটি চলে যায় এবং সুতরাং ভিউএডডসচেমাবাইন্ডিংয়ের কোনও পরিবর্তন করার দরকার নেই ....
RIGHT
:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))