Yanıtlar:
Evet. SCHEMABINDING (her zaman yapıyoruz) kullanmanız iyi olur ve bazen bağımlı bir nesneyi değiştirmek için onu kaldırmanız gerekir. Sadece görünümü değiştirin
ALTER VIEW myView
--Remove this WITH SCHEMABINDING
AS
SELECT ...
GO
ALTER VIEW bunu yapmanıza izin vermeyecek mi? Bir görünüm oluşturduğunuzda şunları yaparsınız:
CREATE VIEW
WITH SCHEMABINDING
AS
SELECT stmt
GO
bu yüzden WITH yantümcesini kaybet:
ALTER VIEW viewname
AS
SELECT stmt
GO
MSDN'deki ALTER VIEW'a bakın
Saatlerce etrafa baktıktan sonra, bunun için 2 depolanmış proc oluşturdum. Umarım bu birine yardımcı olur
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
Ve SCHEMABINDING koymak için:
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
"Olduğu gibi" sağlanır ...
ViewRemoveSchemaBinding'ın bu sürümü, görünüm oluşturulduğundan beri yeniden adlandırılmış olsa bile çalışır. (Sorun, görünüm yeniden adlandırılmışsa, OBJECT_DEFINITION () eski adı kullanarak bir tanım döndürmeye devam etmesidir.)
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
Bu çalıştırdıktan sonra yeniden adlandırma sorunu gider ve böylece ViewAddSchemaBinding değiştirilmesi gerekmez gibi görünüyor ....
RIGHT
değiştirin:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))