3

У меня есть таблица с автоинкрементным идентификационным номером/столбцом первичного ключа с именем ID.MS SQL Auto Increment non Identity Column

CREATE TABLE Table1(

[ID] [bigint] IDENTITY(1,1) NOT NULL, 

[TextContent] [nvarchar](450) NOT NULL, 

[Version] [bigint] NOT NULL) 

Когда я ОБНОВЛЯЮТ [TextContent], я хотел бы, чтобы [Версия] увеличивалась на единицу. Цель состоит в том, чтобы иметь версию для каждой строки, которая увеличивается в любое время, когда строка обновляется.

Есть ли разумный способ сделать это в одной таблице? Возможно, что-то связано с вычисленными значениями столбцов и/или триггерами?

Я использую MSSQL 2008 через Entity Framework.

Спасибо за любую информацию!

+0

Триггер может сделать трюк. Посмотрите также на отслеживание изменений/CDC (изменение данных). –

+1

Вам нужно обновить столбец «Версия» только при обновлении столбца «TextContent» или при обновлении любого столбца? В случае последнего взгляните на специальный тип столбца [rowversion] (https://msdn.microsoft.com/en-us/library/ms182776.aspx), который также можно использовать для bigint. –

ответ

2

Это после обновления, как описано в комментариях. Он просто увеличивает версию этой строки.

ALTER TRIGGER triggerIncrementUpdate 
ON Table1 
AFTER UPDATE 

AS 
BEGIN 

UPDATE Table1 SET Version += 1 FROM Table1 INNER JOIN INSERTED As I ON Table1.ID = I.ID 

END 
+0

Это также работает после обновления? –

+1

Я бы сказал, 'set version + = 1' –

+0

@IvanStarostin, вы правы, он должен быть MAX (Version) не MAX (ID). – Iztoksson

1

использование trigger

Create trigger testtrigger 
ON Table1 
After insert 
As 
begin 
declare @tempIDversion bigint 
select @tempIDversion =ID from Table1 
    insert into Table1(version) values (@tempIDversion) 
END 
+0

Как-то эта версия триггера не ссылается на таблицу «INSERTED» и не поддерживает несколько вложений/обновлений. –

3

Метод 1

Попробуйте создать триггер

CREATE TRIGGER incrementValue 
ON Table1 
FOR Insert 
AS 
    Update Table1 
    set columnvalue = columnvalue +1 
    where id in (select id from inserted) 
GO 

Способ 2

Использование команды Обновить

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

UPDATE Tab 
    SET Version= Version + 1 
WHERE id = 1 
+0

@Simon Ordo Он обновит значение столбца до PrevValue +1 после вставки значения. Дайте мне знать, если это поможет –

0

Может быть, слишком поздно, но SQL имеет rowversion тип данных, который изменяется автоматически на каждой вставке или обновлении строки.

Это противоречит всей базе данных в качестве вставок или обновлений, как Microsoft explains here:

Каждая база данных имеет счетчик, который увеличивается для каждой вставки или изменения операции, которая выполняется на столе, который содержит столбец rowversion в пределах базы данных. Этот счетчик - это rowversion базы данных. Это отслеживает относительное время в базе данных, а не фактическое время, которое может быть связано с часами. В таблице может быть только один столбец rowversion. Каждый раз, когда строка с столбцом rowversion изменена или вставлена, значение rowversion с добавленной базой данных вставляется в столбец rowversion.

Это не увеличивается на единицу Vs. предыдущее значение столбца, которое вы пытаетесь достичь, оно просто устанавливается со всем счетчиком базы данных вставок и обновлений.

Но это очень полезно, потому что оно изменяется только при обновлении строки и всегда обновляется с более высоким значением, которое вы можете использовать для bigint.

Также вы можете забыть о триггерах для этой цели.

Смежные вопросы