Есть ли CREATE TABLE или CREATE PROCEDURE автоматически определять тип столбца в SSMS? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть сценарий создания базы данных, который устанавливает таблицы, хранимые процедуры, представления и т. Д. c. Когда я изменяю тип столбца в операторе создания таблицы, я хочу, чтобы это изменение было отражено в операторах создания хранимых процедур / представлений / et c, которые ссылаются на эту таблицу без необходимости go и вручную изменять каждый из них. .

Другими словами, я хочу, чтобы мои хранимые процедуры автоматически определяли тип столбца на основе типа другого столбца при создании. Мне не нужно это для работы с действующей базой данных с данными, просто пока я перебираю дизайн и прототипирование.

Что-то вроде TYPE_OF() в этом (вымышленном) примере:

create table Logs
(
    id              int identity(1, 1) primary key,
    userName        varchar(32),
    logType         int foreign key references LogType(id),
    description     varchar(128),
    datestamp       datetime
);
go

create procedure WriteLog
(
    @userName       TYPE_OF(Logs.userName),   -- should be varchar(32),
    @logType        int,
    @description    TYPE_OF(Logs.description)    -- should be varchar(128)
)
as
begin

    insert into Logs
    values(@userName, @logType, @description, SYSDATETIME());

end
go;

Мне кажется, я помню нечто подобное из Oracle / SQL Plus / PL SQL, но у меня возникают проблемы с его поиском.

Я использую SQL Server Management Studio v18 0,4

1 Ответ

0 голосов
/ 14 февраля 2020

Не уверен, что функция TYPEOF, которую вы ищете, выходит, но вы можете попробовать и использовать DDL Trigger , чтобы поддерживать вашу процедуру в синхронизации c с изменениями типа столбца.

Этот триггер будет срабатывать при каждом изменении таблицы, и вам просто нужно будет проанализировать EVENTDATA (), чтобы увидеть, изменились ли типы столбцов в таблице Logs. Тело вашего триггера будет выглядеть примерно так:

CREATE TRIGGER OnLogsChanged
ON DATABASE
FOR ALTER_TABLE
AS
BEGIN
    -- 1. Parse EVENTDATA() to see if the Logs table was altered

    -- 2. If it has, store the definition of the WriteLog procedure into a variable by reading it from sys.procedures

    -- 3. Read the new types for the columns of the Logs table from sys.all_columns

    -- 4. replace the parameter declarations in the procedure definition to match the new types in the Logs table

    -- 5. alter the procedure with the new definition by building up the ALTER PROCEDURE statement as a string and executing it with sp_executesql
END

Пока триггер остается включенным, ваша процедура должна синхронизироваться c с типами столбцов таблицы.

...