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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2013, 21:14   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию Transaction процедура: сделать архив, если количество столбцов не совпадает

Уважаемые форумчане, я не могу сообразить как я могу сделать трансакцию (желательно с точкой отката Rollback), если в архивной таблице столбцов больше (первый - автосчетчик записи архива, четвертый - дата архивации, также значение по default now), чем в таблице, откуда записи архивируются.
У меня в таблице Timetable расписание автобусных рейсов (вернее его состояние для диспетчера), которое должно архивироваться и обновляться. Поле status со значением 2 - водитель завершил рейс и в определенное время будет запускаться процедура и архивировать все завершенные рейсы.

Я знаю нужно как-то использовать VALUES, а как это сделать граммотно в хранимой процедуре - не знаю.

У меня такой код
Код:
CREATE PROCEDURE transTest ( @status INT = 2) 
AS

BEGIN TRY

    BEGIN TRAN

--Добавляем записи в архив
INSERT INTO dbo.Archive (ID_record, ID_reis) // ID_record - индекс записи в табл Timetable, ID_reis - индекс автобусного рейса
       
SELECT  ID_record, ID_reis   

 FROM dbo.Timetable
        WHERE  dbo.Timetable.ID_status = @status  

--Удаляем записи из таблицы Расписание о завершенных рейсах
DELETE 
        FROM dbo.Timetable
        WHERE dbo.Timetable.ID_status = @status

    COMMIT TRAN

END TRY

BEGIN CATCH
END CATCH
Ругается: Insert Error: Column name or number of supplied values does not match table definition.
Потому что у меня в таблице Archive не две колонки (ID_record, ID_reis), а четыре (ID_archive, ID_record, ID_reis, arc_date)
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 12.04.2013, 23:03   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Blondy, а случайно триггеров на вставку для таблицы Archive ни каких нет? Или на удаление из Timetable? Может в триггерах корявый INSERT есть. В процедуре не вижу
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.04.2013 в 23:09.
Аватар вне форума Ответить с цитированием
Старый 12.04.2013, 23:12   #3
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

как определены ID_archive и arc_date ?
eval вне форума Ответить с цитированием
Старый 12.04.2013, 23:29   #4
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Дорогой Аватар, триггеров нет. Вот пока какой инсерт в самой процедуре
Код:
--Добавляем записи в архив
INSERT INTO dbo.Archive (ID_record, ID_reis) // ID_record - индекс записи в табл Timetable, ID_reis - индекс автобусного рейса
       
SELECT  ID_record, ID_reis   

 FROM dbo.Timetable
        WHERE  dbo.Timetable.ID_status = @status
Цитата:
как определены ID_archive и arc_date ?
Уважаемый eval, на полях в таблице Архив на первой колонке ID_archive стоит автономер Identity, а последняя колонка таблицы arc_date получает по умолчанию значение DATETIME Now()
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 13.04.2013, 00:31   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

покажите скрипты на создание таблиц
eval вне форума Ответить с цитированием
Старый 13.04.2013, 15:22   #6
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Вот скрипты:
Код:
//НА создание таблицы Timetable

CREATE TABLE [dbo].[Timetable](
	[ID_record] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
	[ID_reis] [int] NOT NULL,
	[ID_status] [int] NOT NULL )
GO
ALTER TABLE [dbo].[Timetable]  WITH CHECK ADD  CONSTRAINT [fk_reis_id] FOREIGN KEY([ID_reis])
REFERENCES [dbo].[Reis] ([IDreis])
GO
ALTER TABLE [dbo].[Timetable] CHECK CONSTRAINT [fk_reis_id]
GO
ALTER TABLE [dbo].[Timetable]  WITH CHECK ADD  CONSTRAINT [fk_status] FOREIGN KEY([ID_status])
REFERENCES [dbo].[Status] ([ID_status])
GO
ALTER TABLE [dbo].[Timetable] CHECK CONSTRAINT [fk_status]


//На создание таблицы Archive

CREATE TABLE [dbo].[Archive](
	[archive_id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
	[ID_record] [int] NULL,
	[ID_reis] [int] NULL,
	[arc_date] [datetime] NULL DEFAULT (getdate())  )

//На создание таблицы Status

CREATE TABLE [dbo].[Status](
	[ID_status] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
	[Status] [nvarchar](50) NOT NULL )
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 13.04.2013, 15:30   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А по-моему нужно просто убрать описания вставляемых полей
Код:
INSERT INTO dbo.Archive 
       
SELECT  ID_record, ID_reis   

 FROM dbo.Timetable
        WHERE  dbo.Timetable.ID_status = @status
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.04.2013, 16:52   #8
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Цитата:
А по-моему нужно просто убрать описания вставляемых полей
Мне кажется так не пойдет - мы же должны указать каким полям в таблице Архив будут присвоены значения.
К сожалению, сейчас проверить не могу - среда под рукой будет только вечером))
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 13.04.2013, 19:13   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Я бы так попробовал, почему вариант Blondy не работает не понял
Код:
INSERT INTO dbo.Archive (ID_record, ID_reis, arc_date)
  SELECT  ID_record, ID_reis, getdate()   
    FROM dbo.Timetable
    WHERE  dbo.Timetable.ID_status = @status
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.04.2013, 19:22   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
мы же должны указать
Так они перечисляются в select-ной части инсерта...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчёт в стринггриде если заполнены только первые n столбцов _Oleg Общие вопросы Delphi 4 27.12.2012 18:03
В матрице m*n определить номера и количество полностью нулевых столбцов moshensky Общие вопросы C/C++ 1 08.11.2012 16:12
вывод номеров столбцов матрицы и подсчитать количество этих столбцов Vitalina69 Помощь студентам 2 15.02.2011 21:52
Как получить количество столбцов из выборки ssdm Java Базы данных (JDBC, JPA, Hibernate) 1 25.01.2010 19:21
Подскажите что делать если в екселе пропали буквы столбцов ivkoa Microsoft Office Excel 2 22.07.2008 16:55