SCHEMABINDING'i bir görünüm için yeniden oluşturmadan nasıl kapatabilirim?


Yanıtlar:


11

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

ben de yaptım, ama bazen diğer nesneler (fonksiyonlar, görünümler) buna bağlı. Bu yüzden bu bayrağı bir süre işaretlemek / işaretini kaldırmak iyi olacaktır :). Db'nin şu anki sürümünde bu mümkün değil, değil mi?
garik

@garik: doğru, aynı problemim var. Her bağımlı nesnede ALTER çalıştırın ... Herhangi bir zamanda SQL Server kuralları uygulayacaktır: "kapatamazsınız" çünkü bu tutarsızlığa yol açacaktır
gbn 28:11

8

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


5

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 ...


2

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 ....


1
Komut hala 'SCHEMABINDING İLE' içerdiğinden, bu işe yaramaz - düzeltmek için kullanımını şu şekilde RIGHTdeğiştirin:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))
Cocowalla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.