Как название вида не синхронизируется с определением вида?
-
13-12-2019 - |
Вопрос
Я отследил ошибку в своей системе, связанную с этой аномалией - по крайней мере, это аномалия в моей системе из 15 каталогов с похожими, но неодинаковыми схемами.
Что приводит к тому, что [ИМЯ_ТАБЛИЦЫ] в [INFORMATION_SCHEMA].[VIEWS] отличается от значения в [VIEW_DEFINITION]?
Это заставляет меня думать, что я чего-то не понимаю в представлениях или системных таблицах в SQL Server....
Решение
Если вы переименовали представление, название изменится, но определение - нет.
Вы должны сделать это как DROP
/CREATE
или ан ALTER
скрипт, а не щелчком правой кнопки мыши или с помощью sp_rename
.
На самом деле это ожидаемое поведение для всех модулей.Вот краткий тест с использованием простой хранимой процедуры:
CREATE PROCEDURE dbo.proc_foo
AS
SELECT 1;
GO
-- rename it to proc_bar
EXEC sys.sp_rename N'dbo.proc_foo', N'proc_bar', N'OBJECT';
GO
-- check the definition from various sources
SELECT od = OBJECT_DEFINITION(OBJECT_ID(N'dbo.proc_bar')),
info_s = (SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME = N'proc_bar' AND SCHEMA_NAME = N'dbo'),
sql_m = (SELECT definition FROM sys.sql_modules
WHERE [object_id] = OBJECT_ID(N'dbo.proc_bar'));
Результаты:
od info_s sql_m
----------------------------- ----------------------------- -----------------------------
CREATE PROCEDURE dbo.proc_foo CREATE PROCEDURE dbo.proc_foo CREATE PROCEDURE dbo.proc_foo
AS AS AS
SELECT 1; SELECT 1; SELECT 1;
В любом случае, вам не следует использовать INFORMATION_SCHEMA
в любом случае...