Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запись по умолчанию.  [new]
romskom
Member

Откуда:
Сообщений: 89
Есть задачка:
Есть Справочник, в нем какое то количество записей. Нужно пометить одну из них, как запись по умолчанию.
Какие есть варианты реализации? Первое что приходит в голову вставить byte столбец defValue - если он True - то это запись по умолчанию. Но тогда необходимо следить, чтобы такая запись была только одна. Вопрос как это сделать? Писать триггер на INSERT / UPDATE?
Может есть решение лучше?
20 апр 12, 10:33    [12443826]     Ответить | Цитировать Сообщить модератору
 Re: Запись по умолчанию.  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Уникальный фильтрованный индекс.
20 апр 12, 10:37    [12443842]     Ответить | Цитировать Сообщить модератору
 Re: Запись по умолчанию.  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
romskom
Есть задачка:
Есть Справочник, в нем какое то количество записей. Нужно пометить одну из них, как запись по умолчанию.
Какие есть варианты реализации? Первое что приходит в голову вставить byte столбец defValue - если он True - то это запись по умолчанию. Но тогда необходимо следить, чтобы такая запись была только одна. Вопрос как это сделать? Писать триггер на INSERT / UPDATE?
Может есть решение лучше?


А чем ограничение UNIQUE не подходит ?
20 апр 12, 10:38    [12443846]     Ответить | Цитировать Сообщить модератору
 Re: Запись по умолчанию.  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
romskom
Есть задачка:
Есть Справочник, в нем какое то количество записей. Нужно пометить одну из них, как запись по умолчанию.
Какие есть варианты реализации? Первое что приходит в голову вставить byte столбец defValue - если он True - то это запись по умолчанию. Но тогда необходимо следить, чтобы такая запись была только одна. Вопрос как это сделать? Писать триггер на INSERT / UPDATE?
Может есть решение лучше?
В отдельной таблице хранить ключи дефолтных записей для разных справочников. Всего два поля(ключ+тип справочника).
Таблицу можно усложнить на свой вкус (дополнительное деф.значение, значение по некоторому условию и т.п.)
20 апр 12, 10:50    [12443926]     Ответить | Цитировать Сообщить модератору
 Re: Запись по умолчанию.  [new]
romskom
Member

Откуда:
Сообщений: 89
Ken@t,

А разве множество False не будет нарушать это условие?
20 апр 12, 11:09    [12444076]     Ответить | Цитировать Сообщить модератору
 Re: Запись по умолчанию.  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
romskom
Ken@t,

А разве множество False не будет нарушать это условие?

Будет, не внимательно прочёл условие задачи - фильтрованный индекс если версия позволяет.
20 апр 12, 11:25    [12444215]     Ответить | Цитировать Сообщить модератору
 Re: Запись по умолчанию.  [new]
mike909
Member

Откуда:
Сообщений: 662
romskom
Есть задачка:
Есть Справочник, в нем какое то количество записей. Нужно пометить одну из них, как запись по умолчанию.
Какие есть варианты реализации? Первое что приходит в голову вставить byte столбец defValue - если он True - то это запись по умолчанию. Но тогда необходимо следить, чтобы такая запись была только одна. Вопрос как это сделать? Писать триггер на INSERT / UPDATE?
Может есть решение лучше?

Одно из решений:
Ключ в справочнике на identity(1,1). Запись по умолчанию с ключем = 0, update/delete которой блокируем через триггер.
При необходимости сохранять записи из подчиненных таблиц при удалнеии обычных записей из справочника, можно настроить на автоматическое переназначение на "записи по умолчанию"
+ создание тестовых таблиц
CREATE TABLE dbo.SomeDict(
  [id] int IDENTITY(1,1) NOT NULL,
  -- blablabla
  [descr] [nvarchar](512) NULL,
 CONSTRAINT [PK_lines] PRIMARY KEY CLUSTERED ([id] ASC)  
)
GO
CREATE TRIGGER [dbo].[tg_du_SomeDict]
   ON [dbo].[SomeDict]
   AFTER DELETE, UPDATE
AS 
BEGIN
	SET NOCOUNT ON;
	
	if exists(select 1 from deleted where id = 0)
	begin
	  ROLLBACK TRANSACTION
	  
	  raiserror( 'Служебную запись удалять/изменять запрещено', 15, 1 )
	end
END

GO
SET IDENTITY_INSERT dbo.SomeDict ON
INSERT INTO dbo.SomeDict( id, descr ) values(0, 'Запись по умолчанию')
SET IDENTITY_INSERT dbo.SomeDict OFF

GO

DBCC checkident( 'dbo.SomeDict', RESEED, 0) -- чтоб [id] c 1_цы

INSERT INTO dbo.SomeDict( descr ) values( 'Обычная запись')
--SELECT * from dbo.SomeDict

GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[RefTBL](
	[sd_id] [int] NOT NULL DEFAULT(0), --< ссылка на "запись по умолчанию" dbo.SomeDict
	[val] [int] NOT NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[RefTBL]  WITH CHECK ADD  CONSTRAINT [FK_RefTBL_SomeDict] FOREIGN KEY([sd_id])
REFERENCES [dbo].[SomeDict] ([id])
ON UPDATE CASCADE
ON DELETE SET DEFAULT --< Если есть желание сохранить запись при удалении из [dbo].[SomeDict]
GO

ALTER TABLE [dbo].[RefTBL] CHECK CONSTRAINT [FK_RefTBL_SomeDict]
GO

+ пример
INSERT INTO [dbo].[RefTBL](sd_id, val) values (1, 1),(1, 2),(1, 3)

GO

SELECT *
FROM [dbo].[RefTBL] as r
INNER JOIN [dbo].[SomeDict] as d on
  r.sd_id = d.id

GO

DELETE FROM [dbo].[SomeDict] where id = 1

GO

SELECT *
FROM [dbo].[RefTBL] as r
INNER JOIN [dbo].[SomeDict] as d on
  r.sd_id = d.id
20 апр 12, 11:33    [12444300]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить