Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 22.07.2015, 00:31   #1
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию Выполнять INSERT каждого дня только 1 раз

Здравствуйте . Работаю MS SQL есть такой две таблица

Код:
create table Tab1
(id int identity(1,1) primary key,
 dt datetime default getdate(),
 mon money,
)
и
Код:
create table Tab2
(id int identity(1,1),
 dt datetime default getdate(),
 mon money,
 Tab1ID int not null,
 constraint FK_tab2 foreign key (Tab1ID) references Tab1(id) on delete cascade
);
На Tab1 есть такой триггер
Код:
CREATE TRIGGER  NachislINSERT
ON Tab1 FOR INSERT
AS
BEGIN
	insert Tab2  (Tab1ID, mon)
	select id, mon/100*10
	from Tab1
	where NOT EXISTS
	                (select Tab1ID, mon from Tab2  
	                 where Tab1.id =Tab2.Tab1ID)
END
добавляю несколько запись на Tab1
Код:
insert into Tab1(mon) values(200),
                            (300),
                            (400)
Вопрос: Я хочу что это код выполнялось каждого дня только 1 раз
Код:
insert Tab2(mon, Tab1ID)
select mon/100*1 ,id
from Tab1
where exists(select mon, Tab1ID
             from Tab2 
             where Tab1.id=Tab2.Tab1ID)
Скажите пожалуйста как это реализовать ?

Последний раз редактировалось xxbesoxx; 22.07.2015 в 01:48.
xxbesoxx вне форума
Старый 22.07.2015, 06:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты напиши запрос типа
Код:
select count() from tab1 where dt=GetDate()
Если такой запрос даст 0 - значит сегодня еще записей с такой датой не было.
I'm learning to live...
Stilet вне форума
Старый 22.07.2015, 08:33   #3
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Если такой запрос даст 0 - значит сегодня еще записей с такой датой не было.
Stilet Спасибо за внимание , Я хочу что это выполнялось каждого дня только 1 раз. можете показать примерно как это коде ?
xxbesoxx вне форума
Старый 22.07.2015, 08:53   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну первое, что пришло мне в голову:
Код:
CREATE TRIGGER  NachislINSERT
ON Tab1 FOR INSERT
AS
BEGIN
 declare @i int;
 @i=(select count(*) from tab1 where dt=GetDate())
 if @i=0 then
	insert Tab2  (Tab1ID, mon)
	select id, mon/100*10
	from Tab1
	where NOT EXISTS
	                (select Tab1ID, mon from Tab2  
	                 where Tab1.id =Tab2.Tab1ID)
 end if
END
Это с потолка, я так не помню синтаксис T-SQL...

Второе - настроить планировщик задач, чтоб он в час ночи выполнял твой инсерт, а не по триггеру, но я не уверен что правильно понял задание.
I'm learning to live...
Stilet вне форума
Старый 22.07.2015, 09:07   #5
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
настроить планировщик задач, чтоб он в час ночи выполнял твой инсерт,
Ойй да друг . Я слишал что есть такой . читаю-изучаю от суда http://www.askit.ru/custom/sql2005_a...agent_jobs.htm Я это "Задания (jobs)" никогда не делал.
Было бы хорошо если можете выложить силка где это написано боле подробно и понятно . или на тот силке тоже нормально написано ?

Последний раз редактировалось xxbesoxx; 22.07.2015 в 09:09.
xxbesoxx вне форума
Старый 22.07.2015, 09:30   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

почитайте Триггеры: создание и применение

если я правильно понял задачу, то когда Вы выполняете Insert в таблицу Tab1
Вам нужно вставлять запись в таблицу Tab2 ?
так вот, все записи, которые Вы вставляете, доступны в триггере в некой таблице с именем inserted. Берите оттуда записи и вставляйте. Зачем полностью выборку из двух таблиц делать?!!
Serge_Bliznykov вне форума
Старый 22.07.2015, 10:40   #7
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
если я правильно понял задачу,
Serge_Bliznykov спасибо за внимание , можеть я что то не правильно объяснил . Я хочу каждого дня выполнять это запрос 1 раз день в таком время: 23:59
Код:
insert Tab2(mon, Tab1ID)
select mon/100*1 ,id
from Tab1
where exists(select mon, Tab1ID
             from Tab2 
             where Tab1.id=Tab2.Tab1ID)
Цитата:
так вот, все записи, которые Вы вставляете, доступны в триггере в некой таблице с именем inserted.
Не будеть доступны не. Здесь только "Реализация заданий" читаю-изучаю https://msdn.microsoft.com/ru-ru/lib...ql.105%29.aspx нада же
xxbesoxx вне форума
Старый 22.07.2015, 10:55   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я хочу каждого дня выполнять это запрос 1 раз день в таком время: 23:59
Ну я делаю это так:
Создал скрипт
Код:
USE [моя база]
insert ... тут твой инсерт
А у меня там поджим транзакций и бэкап базы
GO
поместил в Gogo.sql.
Далее создал Ватника:
Код:
"d:\MS SQL\Client\100\Tools\Binn\SQLCMD.EXE" -S localhost -UЮзырь -PПароль -i "Gogo.sql"
Ну а ватку эту закинул в планировщик задач винды, настроив в ней время выполнения.
I'm learning to live...
Stilet вне форума
Старый 22.07.2015, 11:18   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Я хочу каждого дня выполнять это запрос 1 раз день в таком время: 23:59
ага. понятно.
тогда совет Виталия в тему - Вам нужно использовать планировщик задания.

Кстати, в MS SQL server есть свой планировщик заданий.
подробнее:

Инструкция: Настройка регулярного резервного копирования БД MS SQL Server

Мастер-Тур:Создание заданий для MS SQL Server Express


Только два замечания.

первое. Зачем Вам тогда нужен триггер?! Он тут совсем не при делах!

второе. я на 99.9% уверен, что то, что Вам раз в день требуется выполнять данный запрос - это просто результат ПЛОХОЙ организации структуры БД. Не буду это утверждать 100%, т.к. не понятно, что за таблицы Tab1 и Tab2 и зачем раз в сутки что-то из одной таблицы переносить в другую. Но обычно это говорит о том, что структура БД имеет недостатки!
я бы подумал ещё трижды над структурой БД, точно ли нельзя обойтись без планировщика, либо изменением логики БД, либо тем же триггерами, например...

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Не будеть доступны не.
простите, я не понял вашу мысль... (да, я знаю, что русский язык для Вас иностранный, часто догадываюсь, что Вы хотели сказать, но тут не смог понять..)
Serge_Bliznykov вне форума
Старый 22.07.2015, 13:22   #10
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Stilet и Serge_Bliznykov огромное вам человеческое спасибо , Много раз помогли , буду решать по другому . без Реализация заданий показали здесь http://www.cyberforum.ru/sql-server/...ml#post7898541 что можно решать без JOB и мне это пример нравится .
Спасибо ребята , что уделили мне время , Спасибо за помощь ... Удачного вам дня тема можно закрыть
xxbesoxx вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск всплывающего окна в последние 3 дня месяца 1 раз в сутки Wildizard HTML и CSS 0 21.01.2015 22:07
Delphi 2006 - Известна средняя температура каждого дня недели. Узнайте среднюю температуру за всю неделю... Roholana Помощь студентам 0 17.01.2012 23:28
Создать итоги для каждого дня, месяца, года kammal Microsoft Office Excel 1 03.10.2010 21:30
Фоновая программа корректно работает только пол дня (использовал таймер) TwiX Общие вопросы Delphi 2 06.09.2010 17:57
Как запустить приложение, дождаться его исполнения и только потом выполнять код? il76 Win Api 6 19.07.2007 14:00