Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MSSQL: При обновлении пользовательского типа данных не пересоздаются зависимые объекты #132

Closed
KittyNicky opened this issue Dec 7, 2023 · 7 comments
Labels

Comments

@KittyNicky
Copy link

KittyNicky commented Dec 7, 2023

Проблема: существует пользовательский тип данных, который необходимо обновить. На одном сервере внесены изменения в поле, которые необходимо накатить на другой сервер. Так же существует процедура, использующая этот пользовательский тип данных.

Исходная версия на одном сервере:

CREATE TYPE [dbo].[udtt_test] AS TABLE(
	[id] [int] NOT NULL,
	[name] [nvarchar] (100) COLLATE Cyrillic_General_CI_AS NOT NULL
)
GO
CREATE PROCEDURE [dbo].[test_procedure] @udtt udtt_test READONLY
WITH EXECUTE AS OWNER
AS
    BEGIN
        SET NOCOUNT ON;

        SELECT 1;
    END;
GO

Версия на другом сервере:

CREATE TYPE [dbo].[udtt_test] AS TABLE(
	[id] [int] NOT NULL,
	[name] [nvarchar] (300) COLLATE Cyrillic_General_CI_AS NULL
)
GO
CREATE PROCEDURE [dbo].[test_procedure] @udtt udtt_test READONLY
WITH EXECUTE AS OWNER
AS
    BEGIN
        SET NOCOUNT ON;

        SELECT 1;
    END;
GO

Скрипт, формируемый pgCodeKeeper:

DROP TYPE IF EXISTS [dbo].[udtt_test]
GO

CREATE TYPE [dbo].[udtt_test] AS TABLE(
	[id] [int] NOT NULL,
	[name] [nvarchar] (300) COLLATE Cyrillic_General_CI_AS NOT NULL
)
GO

Ошибки при выполнении скрипта:
Сообщение 3732, уровень 16, состояние 1, строка 4
Невозможно удалить тип "dbo.udtt_test", так как на него ссылается объект "test_procedure". Могут существовать другие объекты, которые ссылаются на этот тип.
Сообщение 219, уровень 16, состояние 1, строка 7
Тип "dbo.udtt_test" уже существует, или отсутствует разрешение на его создание.

Скрипт, который должен формироваться:

DROP PROCEDURE [dbo].[test_procedure];
GO

DROP TYPE [dbo].[udtt_test];
GO

CREATE TYPE [dbo].[udtt_test] AS TABLE (
    [id]   INT            NOT NULL,
    [name] NVARCHAR (300) NOT NULL);
GO

CREATE PROCEDURE dbo.test_procedure @udtt udtt_test READONLY
WITH EXECUTE AS OWNER
AS
    BEGIN
        SET NOCOUNT ON;

        SELECT 1;
    END;
GO
@KittyNicky KittyNicky changed the title MSSQL: MSSQL: При обновлении пользовательского типа данных не пересоздаются зависимые объекты Dec 7, 2023
@AXEPOH AXEPOH added the MS SQL label Jan 31, 2024
@KittyNicky
Copy link
Author

Привет!
Уточните пожалуйста по проблеме, планируете ли вы её исправление?

@AXEPOH
Copy link
Contributor

AXEPOH commented May 2, 2024

Да, когда-нибудь доберемся до нее

@AXEPOH
Copy link
Contributor

AXEPOH commented May 2, 2024

Тут проблема в том, для MS SQL мы не храним списка всех системных типов и из-за этого все типы без указания схемы считаются системными. Для корректной работы можно явно указать схему, в данном случае:

CREATE PROCEDURE dbo.test_procedure @udtt dbo.udtt_test READONLY

@KittyNicky
Copy link
Author

Спасибо! Попробую с явным указанием схемы

@KittyNicky
Copy link
Author

KittyNicky commented May 3, 2024

К сожалению, обходное решение с указанием схемы не сработало.

Пример:

  • На одном сервере:
CREATE TYPE [dbo].[udtt_test] AS TABLE(
	[id] [int] NOT NULL,
	[name] [nvarchar] (300) COLLATE Cyrillic_General_CI_AS NOT NULL
)
GO
CREATE PROCEDURE [dbo].[test_procedure] @udtt dbo.udtt_test READONLY
WITH EXECUTE AS OWNER
AS
    BEGIN
        SET NOCOUNT ON;

        SELECT 1;
    END;
GO
  • На другом сервере:
CREATE TYPE [dbo].[udtt_test] AS TABLE(
	[id] [int] NOT NULL,
	[name] [nvarchar] (100) COLLATE Cyrillic_General_CI_AS NOT NULL
)
GO
CREATE PROCEDURE [dbo].[test_procedure] @udtt dbo.udtt_test READONLY
WITH EXECUTE AS OWNER
AS
    BEGIN
        SET NOCOUNT ON;

        SELECT 1;
    END;
GO
  • Формируемый скрипт:
DROP TYPE IF EXISTS [dbo].[udtt_test]
GO

-- DEPCY: This TYPE is a dependency of PROCEDURE: [dbo].[test_procedure]

CREATE TYPE [dbo].[udtt_test] AS TABLE(
        [id] [int] NOT NULL,
        [name] [nvarchar] (300) COLLATE Cyrillic_General_CI_AS NOT NULL
)
GO

Зависимость определена, но в последовательности действий все равно не хватает пересоздания зависимых объектов

@AXEPOH
Copy link
Contributor

AXEPOH commented May 3, 2024

Посмотрим, что можно сделать

@AXEPOH
Copy link
Contributor

AXEPOH commented May 13, 2024

исправлено в 83b3698

@AXEPOH AXEPOH closed this as completed May 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants