Làm cách nào để tắt SCHEMABINDING cho chế độ xem mà không tạo lại nó?


Câu trả lời:


11

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

tôi cũng vậy, nhưng đôi khi các đối tượng khác (chức năng, khung nhìn) phụ thuộc vào đối tượng này. Vì vậy, sẽ rất tốt để đánh dấu / bỏ đánh dấu cờ này trong một thời gian :). Vì vậy, không thể trong phiên bản hiện tại của db, phải không?
garik

@garik: đúng rồi, tôi có cùng một vấn đề. Chạy ALTER trên từng đối tượng phụ thuộc ... Tại bất kỳ thời điểm nào, SQL Server sẽ thực thi các quy tắc: bạn không thể "tắt" vì điều này sẽ dẫn đến sự không nhất quán
gbn

8

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

Xem THAY ĐỔI XEM trên MSDN


5

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


2

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


1
Điều này không hoạt động, vì lệnh vẫn chứa 'VỚI SCHEMABINDING' - để sửa lỗi, thay đổi cách sử dụng RIGHTthành:RIGHT(@Command, LEN(@Command) - (@PositionShemaBinding + LEN('WITH SCHEMABINDING')))
Cocowalla
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.