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

Откуда:
Сообщений: 28
Подскажите пожалуйста, как правильно написать следующий триггер. Есть таблица, строки в нее только добавляются, существующие строки не изменяются. Добавляться может сразу несколько строк. Требуется, чтобы при добавлении каждой строки, происходила запись значения одного из полей этой добавленной строки в другое поле этой же строки (уже существующее). Это нужно для конвертации, как конвертировать я разобрался, а с триггером разобраться не могу.

CREATE TRIGGER dbo.Convert
ON dbo.test
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;



END
GO

Спасибо!
5 авг 09, 00:33    [7498143]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Первичный ключ в таблице конечно есть...
create trigger dbo.Convert on dbo.test
after insert
as
set nocount on;

	update
		t
	set
		[другое поле] = i.[одно из полей]
	from dbo.test t
	inner join inserted i on t.ПК = i.ПК;
GO
5 авг 09, 06:26    [7498260]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
JackVR
Требуется, чтобы при добавлении каждой строки, происходила запись значения одного из полей этой добавленной строки в другое поле этой же строки (уже существующее). Это нужно для конвертации
Сделайте вычисляемое поле, и триггер вообще не понадобится.
5 авг 09, 08:50    [7498382]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
iap
JackVR
Требуется, чтобы при добавлении каждой строки, происходила запись значения одного из полей этой добавленной строки в другое поле этой же строки (уже существующее). Это нужно для конвертации
Сделайте вычисляемое поле, и триггер вообще не понадобится.


Спасибо.
Данные поле используется у меня в следующем коде:
"(время BETWEEN @homeTime AND @endTime)".
Вы имеете в виду сделать "(время BETWEEN CAST (homeTime, as time(0)) AND CAST (endTime, as time(0)))"? Я думал об этом, но я правильно понимаю, что конвертация будет происходить при каждом вызове? В БД миллионы записей, насколько это скажется на производительности?
5 авг 09, 10:34    [7498869]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
tpg
Первичный ключ в таблице конечно есть...
create trigger dbo.Convert on dbo.test
after insert
as
set nocount on;

	update
		t
	set
		[другое поле] = i.[одно из полей]
	from dbo.test t
	inner join inserted i on t.ПК = i.ПК;
GO


Cпасибо!!!.
Первичного ключа нет, а как его задать, через контекстное меню на поле? А какое поле нужно задать первичным ключом?
5 авг 09, 10:36    [7498876]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Glory
Member

Откуда:
Сообщений: 104760
JackVR

Первичного ключа нет, а как его задать, через контекстное меню на поле? А какое поле нужно задать первичным ключом?

Вы вообще знакомы с теорией баз данных, если задаете такие вопросы ?
Вы еще спросите, что такое столбец и зачем они нужны в таблице.
5 авг 09, 10:39    [7498898]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
JackVR
Первичного ключа нет, а как его задать, через контекстное меню на поле? А какое поле нужно задать первичным ключом?
Уууууу... как фсёзапущено...
Первичный ключ (если кратко определять) - это уникальный идентификатор строки...

Сообщение было отредактировано: 5 авг 09, 10:40
5 авг 09, 10:40    [7498902]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
JackVR
конвертация будет происходить при каждом вызове?
PERSISTED
5 авг 09, 10:42    [7498918]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
JackVR
Спасибо.
Данные поле используется у меня в следующем коде:
"(время BETWEEN @homeTime AND @endTime)".
Вы имеете в виду сделать "(время BETWEEN CAST (homeTime, as time(0)) AND CAST (endTime, as time(0)))"? Я думал об этом, но я правильно понимаю, что конвертация будет происходить при каждом вызове? В БД миллионы записей, насколько это скажется на производительности?
Вы не могли бы изложить проблему последовательно, понятным языком, со скриптом создания таблицы?
Пока я понял только, что у Вас SQL2008, Вы не знаете, что такое вычисляемое поле, и умеете только пользоваться
визуальными средствами SQL Server Management Studio...
5 авг 09, 10:44    [7498934]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Нет, не знаком. Изучаю, но нужно чтобы работало уже сейчас. Все работало до этого,но разработчики приложения, экспортирующего данные в БД, изменили формат одного из полей, и подсказали, что надо использовать триггер.
5 авг 09, 10:45    [7498937]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Glory
Member

Откуда:
Сообщений: 104760
JackVR
Нет, не знаком. Изучаю, но нужно чтобы работало уже сейчас.

Все работала без первичных ключей ??? Однако.
5 авг 09, 10:46    [7498945]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Таблица вот такая. Использовался формат time, его изменили, теперь выводится только в формат varchar(8). И нужно перевести [время2] [varchar](8) NULL в [время] [time](0) NULL

GO

CREATE TABLE [dbo].[GMKN](
[дата] [date] NULL,
[время] [time](0) NULL,
[количество] [int] NULL,
[время2] [varchar](8) NULL
) ON [PRIMARY]

GO
5 авг 09, 10:50    [7498968]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Вернее не перевести, а при получении данных (при добавлении новых строк в таблицу), конвертировать поле [время2] [varchar](8) каждой строки в поле [время] [time](0) этой же строки
5 авг 09, 11:09    [7499113]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
JackVR
(при добавлении новых строк в таблицу), конвертировать поле
Вы прочли статью по данной мною ссылке?
5 авг 09, 11:11    [7499141]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Паганель
JackVR
(при добавлении новых строк в таблицу), конвертировать поле
Вы прочли статью по данной мною ссылке?


Да, спасибо, пытаюсь разобраться...
5 авг 09, 11:19    [7499214]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Glory
Member

Откуда:
Сообщений: 104760
JackVR
Таблица вот такая. Использовался формат time, его изменили, теперь выводится только в формат varchar(8). И нужно перевести [время2] [varchar](8) NULL в [время] [time](0) NULL

GO

CREATE TABLE [dbo].[GMKN](
[дата] [date] NULL,
[время] [time](0) NULL,
[количество] [int] NULL,
[время2] [varchar](8) NULL
) ON [PRIMARY]

GO

Т.е. вы хотите сказать, что у вас не работает команда

INSERT [dbo].[GMKN]([дата],	[время], [количество] ) 
SELECT GETDATE(), '12:35:29', 10
5 авг 09, 11:32    [7499326]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Glory, эта команда работает, она добавила новую строку
5 авг 09, 11:42    [7499421]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Glory
Member

Откуда:
Сообщений: 104760
JackVR
Glory, эта команда работает, она добавила новую строку

И зачем тогда все эти заморочки с другими полями, триггерами ??
5 авг 09, 11:43    [7499436]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Glory
JackVR
Glory, эта команда работает, она добавила новую строку

И зачем тогда все эти заморочки с другими полями, триггерами ??


Извините, но я не уловил сути. Что мне нужно сделать, чтобы при получении данных из другого приложения, БД формировала мне строку вида:

[дата] [date],[время] [time](0),[количество] [int]

Поле [время2] [varchar](8) введено только потому, что другое приложение может экспортировать время только в этот тип данных (то есть экспорт в поле [время] [time](0) невозможен). Для вычислений поле [время2] [varchar](8) не нужно, и я планировал делать конвертацию этого поля в поле [время] в тип данных [time](0), которое мне нужно для вычислений.

Спасибо.
5 авг 09, 11:56    [7499534]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Glory
Member

Откуда:
Сообщений: 104760
JackVR


Извините, но я не уловил сути. Что мне нужно сделать, чтобы при получении данных из другого приложения, БД формировала мне строку вида:

[дата] [date],[время] [time](0),[количество] [int]

Что такое это "получение данных из другого приложения" ? У вас MSSQL запускает какую-то программу на С/Басике/Аксесе ?

JackVR

Поле [время2] [varchar](8) введено только потому, что другое приложение может экспортировать время только в этот тип данных (то есть экспорт в поле [время] [time](0) невозможен). Для вычислений поле [время2] [varchar](8) не нужно, и я планировал делать конвертацию этого поля в поле [время] в тип данных [time](0), которое мне нужно для вычислений.

Если вам не нужно поле [время2] [varchar](8), то зачем вы его вообще храните ?
Что мешает сразу добавить в таблицу только нужные и уже сконвертированные данные ?
5 авг 09, 12:00    [7499570]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Glory, я настраиваю и запускаю экспорт по ODBC в мою БД из другого приложения. Экспортируется таблица. При настройке я должен указать соответствие столбцов между экспортируемой таблицой приложения, и полями моей БД. Для того, чтобы указать в качестве цели экспорта соответствующее поле, должны совпадать типы данных. Если типы данных не совпадают, то экспорт в это поле невозможен. В моем случае проблема в том, что я не могу эскпортировать столбец "Время" из таблицы приложения, так как приложение не понимает тип данных SQL 2008 "time".

Разработчики приложения предложили создать новое поле с типом данных [varchar](8), экспортировать "Время" в него, а в БД написать триггер, который бы конвертировал это поле в нужное мне поле в нужный мне тип данных "time". Потому я задал вопрос про триггер. Если есть более правильные решения этой проблемы, прошу помочь.

Спасибо.
5 авг 09, 12:13    [7499694]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Glory
Member

Откуда:
Сообщений: 104760
JackVR
Glory, я настраиваю и запускаю экспорт по ODBC в мою БД из другого приложения. Экспортируется таблица. При настройке я должен указать соответствие столбцов между экспортируемой таблицой приложения, и полями моей БД. Для того, чтобы указать в качестве цели экспорта соответствующее поле, должны совпадать типы данных.

С чего это они должны совпадать то ? Они должны быть конвертируемы
5 авг 09, 12:15    [7499707]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Glory
JackVR
Glory, я настраиваю и запускаю экспорт по ODBC в мою БД из другого приложения. Экспортируется таблица. При настройке я должен указать соответствие столбцов между экспортируемой таблицой приложения, и полями моей БД. Для того, чтобы указать в качестве цели экспорта соответствующее поле, должны совпадать типы данных.

С чего это они должны совпадать то ? Они должны быть конвертируемы


Да. Но это приложение не позволяет экспортировать в поле БД с типом данных "time". Поле с типом данных "time" попросту не появляется в списке полей БД, в которые возможен экспорт из приложения.
5 авг 09, 12:19    [7499741]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
JackVR
Member

Откуда:
Сообщений: 28
Добрый день.
Помогите доделать триггер:

Я сделал первичный ключ, но так как у меня все поля не являются уникальными, я сделал ключ так:

CREATE TABLE [dbo].[test](
           [дата] [date] NULL,
           [время] [time](0) NULL,
           [количество] [int] NULL,
           [время2] [varchar](8) NULL
	[ключ] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED 
(
	[ключ] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Код триггера:
SET NOCOUNT ON;

	update
		t
	set
		[время] = i.[время2]
	from dbo.test t
	inner join inserted i on t.ключ = i.ключ;

Вот такой запрос работает, триггер срабатывает как надо:
INSERT [dbo].[test] ("время2","ключ")
SELECT '12:35:35',NEWID()

А когда включаю экспорт из приложения, вся эта схема не работает, так как поле "Ключ" не экспортируется, и, соответственно, ключ не формируется.

Как решить проблему с первичным ключом? Как правильно сделать ключ, чтобы все работало?
6 авг 09, 13:42    [7505641]     Ответить | Цитировать Сообщить модератору
 Re: триггер, подскажите как написать  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
JackVR
Я сделал первичный ключ, но так как у меня все поля не являются уникальными, я сделал ключ так
0) Ваша попытка сделать триггер означает, что Вы все-таки не прочли статью по данной мною ссылке

1) Позволяет ли комбинация значений полей "дата" и "время" однозначно отличить одну запись от другой?

2) Возможность (или невозможность) наличия NULL-ов в каждом из полей тоже еще надо обосновать

а вообще рекомендую сначала обратиться в форум Проектирование БД вместо метода проб и ошибок в процессе дизайна Вашей БД
6 авг 09, 13:50    [7505719]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить