Циркулярная ссылка на представление и скалярную функцию на сервере SQL - PullRequest
0 голосов
/ 30 мая 2020

В моей базе данных SQL Server 2012 у меня есть таблица MyTable, представление MyView и скалярная функция MyFun.

Представление будет ссылаться на MyFun, как показано ниже :

CREATE VIEW [dbo].[MyView]
AS
    SELECT dbo.MyFun(Age) AS Expr1
    FROM dbo.MyTable

Хотя функция будет ссылаться на MyView, как показано здесь:

CREATE FUNCTION [dbo].[MyFun] (@Age int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN     
     SET @Age = (SELECT COUNT(*) FROM [db].[MyView]);
     RETURN (@Age + 1);
END;

Поскольку MyFun и MyView вызовут циклическую ссылку, которая должна быть создан первым? Я не могу найти никаких документов по этому поводу.

Я провел тест.

Сначала я экспортирую базу данных как сценарий. Затем я обнаружил в сценарии, что функция создается первой, как показано ниже:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[MyFun] (@Age int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN     
     SET @Age = (SELECT COUNT(*) FROM [db].[MyView]);
     RETURN(@Age + 1);
END;
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MyTable]
(
    [Name] [nchar](10) NULL,
    [Age] [int] NULL
) ON [PRIMARY]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [dbo].[MyView]
AS
    SELECT dbo.MyFun(Age) AS Expr1
    FROM dbo.MyTable
GO

Однако, если я изменю сценарий и добавлю создание функции после создания представления, как показано ниже:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[MyTable]
(
    [Name] [nchar](10) NULL,
    [Age] [int] NULL
) ON [PRIMARY]
GO

CREATE VIEW [dbo].[MyView]
AS
    SELECT dbo.MyFun(Age) AS Expr1
    FROM dbo.MyTable
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[MyFun] (@Age int)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN     
     SET @Age = (SELECT COUNT(*) FROM [db].[MyView]);
     RETURN(@Age + 1);
END;
GO

Тогда создание представления сообщит о следующей ошибке:

Msg 4121, Level 16, State 1, Procedure MyView, Line 3 [Batch Start Line 17]
Cannot find each column » dbo "или определяемая пользователем функция или агрегат" dbo.MyFun ", или имя неоднозначно.

Итак, на основе теста, для циклической ссылки, функция должна быть создана до представления, и функция может ссылаться на объекты, которые еще не были созданы.

Но как насчет других объектов, таких как значения по умолчанию, триггеры, возвращающие табличное значение функции, хранимые процедуры и т. д. c. Если они круговые, относятся друг к другу, то какой из них следует создать в первую очередь, а какой можно создать позже?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...