Помогите пожалуйста побороть глюк в базе с единственным триггером и единственной таблицей. Вернее в майкросовтовском элементе контроля (Grid) который доступен через "управление компьютером".
Увидеть его очень просто. Создаём новую базу и в ней:
[more]
CREATE TABLE [dbo].[Folders] (
[Number] [int] NOT NULL ,
[Owner] [int] NULL ,
[Name] [varchar] (260) COLLATE Cyrillic_General_CI_AS NULL ,
[Attr] [int] NULL ,
[ID] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]
go
ALTER TABLE [dbo].[Folders] WITH NOCHECK ADD
CONSTRAINT [PK_Folders] PRIMARY KEY CLUSTERED
(
[Number]
) ON [PRIMARY]
go
ALTER TABLE [dbo].[Folders] WITH NOCHECK ADD
CONSTRAINT [DF_Folders_Number] DEFAULT ((-1)) FOR [Number]
go
CREATE TRIGGER [TR_Folders] ON [dbo].[Folders]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @NUM INT
IF ((SELECT [Number] FROM inserted) = -1)
BEGIN
SET @NUM = (SELECT MAX(Number) FROM [Folders])
INSERT INTO [Folders]
SELECT @NUM+1, [Owner], [Name], [Attr]
FROM inserted
END
ELSE
INSERT INTO [Folders]
SELECT [Number], [Owner], [Name], [Attr]
FROM inserted
END
go
[/more]
При вставке когда поле Number стоит цифра то всё работает нормально. Когда добавляем строку в непустую таблицу с пустым полем Number (primary key) строка добавляется, поле Number остаётся пустым, но когда закроем таблицу и откроем заного то там увидим нормальное значение.
Но когда первая строка таблицы имеет в поле Number значение = 0, то тогда при вставке с неуказанным Number возникает глюк - после вставки вместо вставляемой строки мы видим первую строку. Для эксперемента предлагаю вводить в поле Name значения типа aaa ccc bbb и нажимать стрелку вниз. Будет грид с абсолютно одинаковыми строками. Однако когда мы его обновим то будет видно что данные введены вполне корректно.
Увидеть его очень просто. Создаём новую базу и в ней:
[more]
CREATE TABLE [dbo].[Folders] (
[Number] [int] NOT NULL ,
[Owner] [int] NULL ,
[Name] [varchar] (260) COLLATE Cyrillic_General_CI_AS NULL ,
[Attr] [int] NULL ,
[ID] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]
go
ALTER TABLE [dbo].[Folders] WITH NOCHECK ADD
CONSTRAINT [PK_Folders] PRIMARY KEY CLUSTERED
(
[Number]
) ON [PRIMARY]
go
ALTER TABLE [dbo].[Folders] WITH NOCHECK ADD
CONSTRAINT [DF_Folders_Number] DEFAULT ((-1)) FOR [Number]
go
CREATE TRIGGER [TR_Folders] ON [dbo].[Folders]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @NUM INT
IF ((SELECT [Number] FROM inserted) = -1)
BEGIN
SET @NUM = (SELECT MAX(Number) FROM [Folders])
INSERT INTO [Folders]
SELECT @NUM+1, [Owner], [Name], [Attr]
FROM inserted
END
ELSE
INSERT INTO [Folders]
SELECT [Number], [Owner], [Name], [Attr]
FROM inserted
END
go
[/more]
При вставке когда поле Number стоит цифра то всё работает нормально. Когда добавляем строку в непустую таблицу с пустым полем Number (primary key) строка добавляется, поле Number остаётся пустым, но когда закроем таблицу и откроем заного то там увидим нормальное значение.
Но когда первая строка таблицы имеет в поле Number значение = 0, то тогда при вставке с неуказанным Number возникает глюк - после вставки вместо вставляемой строки мы видим первую строку. Для эксперемента предлагаю вводить в поле Name значения типа aaa ccc bbb и нажимать стрелку вниз. Будет грид с абсолютно одинаковыми строками. Однако когда мы его обновим то будет видно что данные введены вполне корректно.