Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
Всем привет! Есть таблица с 4 полями, надо сделать так, чтобы она не допускала хранение двух строк с определенными одинаковыми 3 полями. Как лучше сделать, написал триггер для вставки, у меня в триггер вообще почему то не заходит при вставках, может как то через индексы написать, вот только надо применить CAST, так как одно поле cdate, а его надо проверять как date. Как быть, помогите пожалуйста.
24 сен 16, 18:52    [19704491]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Vyacheslav07,

для начала надо внятно сформулировать задачу: привести скрипт таблицы, выписать ограничения, тогда уже станет понятно, делать это триггером, индексом или просто проверкой.
24 сен 16, 19:02    [19704517]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iljy
Vyacheslav07,

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


Ну есть таблица, она не должна хранить одинаковые строки с точки зрения трех полей. одно из этих полей cdate, которое проверять на одинаковость надо в формате date, т.е. время не важно, только дата. Возможно провернуть такой трюк в индексе? Или надо писать триггер?
24 сен 16, 19:07    [19704524]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Vyacheslav07,

т.е. комбинация из трех полей должна быть уникальна? тогда unique constraint. если одно из них сначала надо преобразовать, то вычисляемое поле, а на него уже ограничение. Если просто нужно, чтобы значения полей не были одинаковыми, то check constraint.
24 сен 16, 19:17    [19704550]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iljy,

а как по синтаксису вычислить поле и проверить?
24 сен 16, 19:19    [19704562]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Vyacheslav07,

iljy
Vyacheslav07,
привести скрипт таблицы, выписать ограничения

- неужели трудно хотя бы это сделать? Чтобы не заставлять людей насиловать свой хрустальный шар.
24 сен 16, 19:42    [19704631]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Vyacheslav07,

https://msdn.microsoft.com/ru-ru/library/ms188300.aspx
24 сен 16, 19:43    [19704632]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iljy,
ALTER TABLE Table1 ADD RetailDate AS (CAST(cdate AS date))

CREATE UNIQUE INDEX my_index
	ON Table1(id_1, id_2, RetailDate)


Первая строчка работает, столбец правильно вычисляется, индекс не создается пишет "Имя столбца RetailDate не существует в целевой таблице или представлении". Я знаю что не существует, но как проверить то?
24 сен 16, 20:16    [19704711]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Ну дайте же скрипт вашей таблицы. Мы угадать должны, какого типа у вас стлобец cdate? А это существенно.
24 сен 16, 20:25    [19704736]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
Сон Веры Павловны,

CREATE TABLE Table1 (
id_1 int NOT NULL,
id_2 smallint FOREIGN KEY REFERENCES Table2(id_2),
cdate smalldatetime,
[value] int
);
24 сен 16, 20:27    [19704743]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Vyacheslav07
Первая строчка работает, столбец правильно вычисляется, индекс не создается пишет "Имя столбца RetailDate не существует в целевой таблице или представлении". Я знаю что не существует, но как проверить то?
а у меня создаётся.
24 сен 16, 20:50    [19704804]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Vyacheslav07,

добавьте к объявлению столбца PERSISTED
24 сен 16, 20:50    [19704805]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Vyacheslav07
Я знаю что не существует, но как проверить то?
Вы же его создали, командой ALTER TABLE.
Команда с ошибкой выполнилась, что ли?
Сгенерите скрипт таблицы, если нету поля, то оно не создалось, например, из за неуказания схемы.
24 сен 16, 20:51    [19704809]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Vyacheslav07,

а версия сервера вообще какая?
24 сен 16, 20:54    [19704817]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iljy,

2000
24 сен 16, 20:58    [19704831]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
alexeyvg,

select * from Table1 показало, что поле создалось, а если юзаю persisted, то "Ошибка ALTER TABLE. Следующие параметры SET содержат неверные значения: "ARITHABORT". Убедитесь, что параметры SET содержат значения, подходящие для использования с индексированные представления, индексы для вычисляемых столбцов, отфильтрованные индексы и/или уведомления о запросах, методы типов данных XML и/или операции с пространственными индексами."
24 сен 16, 21:02    [19704840]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iljy,
ALTER TABLE Objects_params ADD RetailDate AS (CAST(cdate AS date)) persisted


пишет "Ошибка ALTER TABLE. Следующие параметры SET содержат неверные значения: "ARITHABORT". Убедитесь, что параметры SET содержат значения, подходящие для использования с индексированные представления, индексы для вычисляемых столбцов, отфильтрованные индексы и/или уведомления о запросах, методы типов данных XML и/или операции с пространственными индексами."
24 сен 16, 21:03    [19704844]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
По-моему, в SQL2000 PERSISTED ещё не было?
24 сен 16, 21:17    [19704887]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
По-моему, в SQL2000 PERSISTED ещё не было?
И уж точно не было типа данных DATE !!!
24 сен 16, 21:19    [19704890]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iljy,

SET ARITHABORT ON
	
ALTER TABLE Objects_params ADD RetailDate AS (CAST(cdate AS date)) persisted
select * from Objects_params

CREATE UNIQUE INDEX my_index
	ON Objects_params(id_object, id_param, RetailDate)


Вот так работает, не добавляет ненужные строки как и надо, но подчеркивается RetailDate в индексе красным и пишет "Имя столбца RetailDate не существует в целевой таблице или представлении" Это просто предупреждение, или необходимо исправить? Ведь этот, так сказать, "косячок" не генерит никаких ошибок запроса.
24 сен 16, 21:22    [19704900]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iap,

Но у меня в параметре БД "Уровень совместимости" стоит 2000. И все выполняется.
24 сен 16, 21:24    [19704905]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Vyacheslav07
но подчеркивается RetailDate в индексе красным и пишет
А, ну у меня тоже подчёркивается. Какая мелочь :-)
24 сен 16, 21:29    [19704927]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Vyacheslav07
iap,

Но у меня в параметре БД "Уровень совместимости" стоит 2000. И все выполняется.
Версия 2000 и уровень совместимости 2000 - это разные вещи.
24 сен 16, 21:30    [19704930]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
alexeyvg,

А если в задании сказано цитирую "решение должно быть совместимо с уровнем БД 2000 MSSQL."? То считается ли оно выполненным с такой настройкой параметра?
24 сен 16, 21:33    [19704944]     Ответить | Цитировать Сообщить модератору
 Re: Cast внутри индекса, еще не работает триггер  [new]
Vyacheslav07
Member

Откуда:
Сообщений: 41
iap,

"В SQL Server 2000 преобразования строковых значений в значения date и time помечаются как детерминированные."
Это в майкрософте пишут.
24 сен 16, 21:38    [19704965]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить