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

Откуда:
Сообщений: 33
Есть 2 таблицы в SQL Server 2000.
Нужно добавить триггер, чтобы при добавлении новой записи в таблицу Seat соблюдалось правило:
Initial_Row.Sector<=Number_Row.Seat <=Finite_Row.Sector (при ID_Sector.Sector=ID_Sector.Seat)
Пожалуйста помогите с реализацией. Что-то пытался написать, но безуспешно...
CREATE TRIGGER INSROW
ON Seat FOR INSERT
AS
IF @@ROWCOUNT=1
BEGIN
  IF NOT EXISTS (SELECT *
      FROM inserted
      WHERE Initial_Row.Sector<=Number_Row.Seat<=Finite_Row.Sector 
        AND ID_Sector.Sector=ID_Sector.Seat 
      BEGIN
    ROLLBACK TRAN
      PRINT
    'Номер ряда не соответствует выбранному сектору зала!'
      END
END


К сообщению приложен файл. Размер - 0Kb
11 янв 10, 00:54    [8163118]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
flame33,

За * в запросе триггера (так же SP, View ...) нужно расстреливать. Насмерть.
11 янв 10, 02:38    [8163199]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
Гость888
flame33,

За * в запросе триггера (так же SP, View ...) нужно расстреливать. Насмерть.
Да ладно. Это вы сами придумали, или рассказал кто в очередной умной книжке?
11 янв 10, 02:46    [8163205]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Гавриленко Сергей Алексеевич
Гость888
flame33,

За * в запросе триггера (так же SP, View ...) нужно расстреливать. Насмерть.
Да ладно. Это вы сами придумали, или рассказал кто в очередной умной книжке?



Пример 1 (basic level)

Есть некая аппликуха где на одном из экранов отображается информация c зарплатой работников по отделам. Таблица для этого проста и незатейлева:

CREATE TABLE [dbo].[SalaryFIO](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[DepNo] [int] NOT NULL,
	[FirstName] [varchar](10) NULL,
	[LastName] [varchar](20) NULL
) ON [PRIMARY]
GO 
CREATE CLUSTERED INDEX FIO_1 ON FIO (DepNo, FirstName, LastName)

Данные на экран помещаются так же простым и незатейлевым запросом оформленым внутри SP, который, предположим для простоты, возвращает всегда только одну запись

SELECT * FROM SalaryFIO WHERE DepNo = @LN

В базе данных у нас, допустим, 5 миллионов работников, а отделов, пусть всего 5. Обычно юзверь получает ответ на свой запрос за считаные миллисекунды и радуется - и это правильно.

В какой-то момент времени понадобилось (для совершено другого приложения) добавить некую дополнительную информацию о работнике:

ALTER TABLE dbo.SalaryFIO ADD MEMO nchar(4000) NULL

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

Пример 2 (intermediate level)

CREATE TABLE [dbo].[t1](
	[a] [int] NOT NULL,
	[b] [int] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[t2](
	[b] [int] NOT NULL,
	[a] [int] NOT NULL
) ON [PRIMARY]
GO

INSERT INTO [dbo].[t1]([a], [b])
SELECT 1, 2
GO
INSERT INTO [dbo].[t2]([b], [a])
SELECT 3, 1
GO

     SELECT * FROM t1
     UNION ALL
     SELECT * FROM t2
-- Правда мы тут получаем интересный результат? Но это еще не та песня шонамнада

    CREATE VIEW combined_t1t2_asterisk AS
     SELECT * FROM t1
     UNION ALL
     SELECT * FROM t2

-- та песня которая начинает нас воистину радовать получаются вот тут:

select * from combined_t1t2_asterisk      
select * from combined_t1t2_asterisk where a = 1


Пример 3 (master level)

Вот это вот дело:

CREATE VIEW MyView AS
SELECT * FROM MyTable

Компилируется только раз в жизни - при создании вьюхи. Поэтому любые иные поля добавленые в MyTable при вызове MyView не появляются. Правда только настоящие мастера способны осознать такое? Среднему человеку это не по плечу.
11 янв 10, 03:43    [8163231]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Извиняюсь за очепятку

CREATE NONCLUSTERED INDEX FIO_1 ON FIO (DepNo, FirstName, LastName)

Так будет нагляднее, да.
11 янв 10, 03:45    [8163232]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8674
Гость888,

а каким образом Ваш пример пересекается с
IF NOT EXISTS (SELECT *
      FROM inserted
?
11 янв 10, 04:10    [8163243]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Блин, нельзя одновременно работать и печатать особо умные мысли для особоодарных оппонентов.

автор
Данные на экран помещаются так же простым и незатейлевым запросом оформленым внутри SP который, предположим для простоты, возвращает всегда только одну запись

Ну и

CREATE NONCLUSTERED INDEX FIO_1 ON SalaryFIO (DepNo, FirstName, LastName)
11 янв 10, 04:13    [8163246]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
SIMPLicity_,

Прямым. В откомпелированом коде никогда не должно быть * после SELECT.
11 янв 10, 04:15    [8163247]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Гость888
никогда не должно быть * после SELECT.


Может того - почитать стоит по теме сначала, прежде чем выступать?
11 янв 10, 04:16    [8163248]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Roman S. Golubin
Гость888
никогда не должно быть * после SELECT.


Может того - почитать стоит по теме сначала, прежде чем выступать?


Вы автору трида или кому-то иному? Я лично читал. И проверял. И примеры привел почему * стоит использовать только в ad-hoc запросах. Проверили приведеные мною примеры? Или у вас нет доступа к серверу?

PS Кстати, большинство написаного имеет место быть не только на SQL Server, а так же на Oracle, DB2 и Sybase.
11 янв 10, 04:33    [8163258]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Гость888
Roman S. Golubin
Гость888
никогда не должно быть * после SELECT.


Может того - почитать стоит по теме сначала, прежде чем выступать?


Вы автору трида или кому-то иному?

Лично тебе. Запрос топикстартера видел? Какие нафиг еще примеры?
11 янв 10, 04:47    [8163262]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Roman S. Golubin
Гость888
Roman S. Golubin
Гость888
никогда не должно быть * после SELECT.


Может того - почитать стоит по теме сначала, прежде чем выступать?


Вы автору трида или кому-то иному?

Лично тебе. Запрос топикстартера видел? Какие нафиг еще примеры?


Тыкать будете своей бабушке в глаз пальцем. Примеры же вроде простые до неимоверности. Даже их сложно было осознать? Бывает... Тогда точно приходится работать за еду. Посмотрите пожалуйста если вам не сложно на Пример 1 (basic level) выше по триду. При больших количествах записей FROM inserted время исполнения вашего замечательного триггера может поменяться от считаных секунд до несчитаных часов.
11 янв 10, 05:02    [8163266]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8674
Гость888
Roman S. Golubin
Гость888
Roman S. Golubin
Гость888
никогда не должно быть * после SELECT.


Может того - почитать стоит по теме сначала, прежде чем выступать?


Вы автору трида или кому-то иному?

Лично тебе. Запрос топикстартера видел? Какие нафиг еще примеры?


Тыкать будете своей бабушке в глаз пальцем. Примеры же вроде простые до неимоверности. Даже их сложно было осознать? Бывает... Тогда точно приходится работать за еду. Посмотрите пожалуйста если вам не сложно на Пример 1 (basic level) выше по триду. При больших количествах записей FROM inserted время исполнения вашего замечательного триггера может поменяться от считаных секунд до несчитаных часов.

Мммм...
Тока вот нинада шо тут заклёвывают Гостей...
Недавно (не более года) очередной раз ообсуждался вопрос нафик в Exists писать select 1 вместа select * ... На примерах была признана монопенисуальность (сиречь - однохуйственность) указанных конструкция.
Я, конешна, магу и абасрацца, но старшие товарищи меня поправят... И ваще пора этот тред (точнее - эту thread) иопнуть... ибо начался холивар не по теме.
11 янв 10, 05:13    [8163271]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Гость888
Тыкать будете своей бабушке в глаз пальцем.

Хех. Здесь тыкать - нормальная форма общения.

Гость888

Примеры же вроде простые до неимоверности. Даже их сложно было осознать? Бывает... Тогда точно приходится работать за еду.


Вопрос был конкретный - какое отношение "примеры" имеют к вопросу топикстартера? Да и, собственно, к приведенному им запросу. Ты высосал проблему из пальца, героически ее решил и теперь готов всех вокруг забрызгать слюной за то, что тебе указали, что в данном случае проблемы никакой и в помине не было?

Гость888
При больших количествах записей FROM inserted время исполнения вашего замечательного триггера может поменяться от считаных секунд до несчитаных часов.


Бабушке своей расскажи.
11 янв 10, 05:27    [8163276]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Roman S. Golubin
Гость888
Тыкать будете своей бабушке в глаз пальцем.

Хех. Здесь тыкать - нормальная форма общения.


Здесь - может быть. Я все же говорил про то как это принято у приличных людей.

Roman S. Golubin

Гость888

Примеры же вроде простые до неимоверности. Даже их сложно было осознать? Бывает... Тогда точно приходится работать за еду.


Вопрос был конкретный - какое отношение "примеры" имеют к вопросу топикстартера?


Прямое отношение. Самое.

Roman S. Golubin
Ты высосал проблему из пальца, героически ее решил и теперь готов всех вокруг забрызгать слюной за то, что тебе указали, что в данном случае проблемы никакой и в помине не было?


Мне понравилось вот тут:

https://www.sql.ru/forum/actualthread.aspx?bid=34&tid=620168&pg=2

По одной из гипотез, человечество развивалось не скачкообразно, а параллельно: т.е. неандертальцы и кроманьонцы одно время существовали рядом друг с другом. Так вот: хилые, тщедущные кроманьонцы пережили своих более физически развитых конкурентов потому, что неандертальцы, из-за особенностей строения их головного мозга, не умели мыслить абстрактно. Таким образом понятия "завтра" для них просто не существовало. Они жили в контексте сегодняшнего дня.
11 янв 10, 05:40    [8163283]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Roman S. Golubin,

И как всегда забыл - у меня лично на той убогой БД сгенереной до меня были все три варианта примеров.
11 янв 10, 05:41    [8163284]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Гость888
Roman S. Golubin,

И как всегда забыл - у меня лично на той убогой БД сгенереной до меня были все три варианта примеров.


При чем тут твоя убогая БД? Вопрос поставлен конкретно.

1. Какое отношение твои "примеры" имеют к конкретному запросу ТС:

автор
IF NOT EXISTS (SELECT * FROM inserted ...


2. Какое отношение твои "примеры" имеют к вопросу ТС:

автор
Нужно добавить триггер, чтобы при добавлении новой записи в таблицу Seat соблюдалось правило:
Initial_Row.Sector<=Number_Row.Seat <=Finite_Row.Sector (при ID_Sector.Sector=ID_Sector.Seat)
11 янв 10, 05:48    [8163288]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Roman S. Golubin
Гость888
Roman S. Golubin,

И как всегда забыл - у меня лично на той убогой БД сгенереной до меня были все три варианта примеров.


При чем тут твоя убогая БД? Вопрос поставлен конкретно.

1. Какое отношение твои "примеры" имеют к конкретному запросу ТС:

автор
IF NOT EXISTS (SELECT * FROM inserted ...


2. Какое отношение твои "примеры" имеют к вопросу ТС:

автор
Нужно добавить триггер, чтобы при добавлении новой записи в таблицу Seat соблюдалось правило:
Initial_Row.Sector<=Number_Row.Seat <=Finite_Row.Sector (при ID_Sector.Sector=ID_Sector.Seat)


Вы наверное тупой? Попробуйте перечитать написаное еще раз.
11 янв 10, 05:59    [8163296]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Гость888
Вы наверное тупой? Попробуйте перечитать написаное еще раз.

Да, видимо я тупой, если общаюсь с тролем. Всего!
11 янв 10, 06:04    [8163297]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
Roman S. Golubin
Гость888
Вы наверное тупой? Попробуйте перечитать написаное еще раз.

Да, видимо я тупой, если общаюсь с тролем. Всего!


Нет, вы тупой просто потому что тупой с рождения. И вам тупому я объяснил что имел опыт с подобным способом кодирования и когда он приводил именно к описаному результату. Так что продолжайте тупить - это единственное что у вас получается неплохо.
11 янв 10, 07:08    [8163317]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
мимо шел я
Guest
Гость888
я имел опыт с подобным способом кодирования и он приводил именно к описаному результату.


Пример опыта - в студию! Один конкретный пример - вполне достаточно. Даже больше того - достаточно плана запросов - правильного и неправильного. И пусть начинается запрос с

автор
IF NOT EXISTS (SELECT *
      FROM ... )


Тсказать, что бы почувствовать разницу.
11 янв 10, 07:12    [8163318]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
мимо шел я
Гость888
я имел опыт с подобным способом кодирования и он приводил именно к описаному результату.


Пример опыта - в студию! Один конкретный пример - вполне достаточно. Даже больше того - достаточно плана запросов - правильного и неправильного. И пусть начинается запрос с

автор
IF NOT EXISTS (SELECT *
      FROM ... )


Тсказать, что бы почувствовать разницу.



https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=725153

там где-то в середине

Сообщение было отредактировано: 9 май 13, 14:17
11 янв 10, 07:15    [8163320]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
мимо шел я
Guest
Гость888
мимо шел я,

https://www.sql.ru/forum/actualthread.aspx?tid=725153&pg=1


и что там искать? просмотрел весь топик,
автор
IF NOT EXISTS (SELECT *
      FROM inserted

не нашел ни разу.
11 янв 10, 07:34    [8163328]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
Гость888
Guest
мимо шел я
не нашел ни разу.


Если вы хотите что бы вас научили - будьте готовы за это платить. Если не хотите платить - пользуйтесь бесплатными советами. Следовать ли вам им или нет - мне как и прочим советчикам без разницы. К тому же я уже привел вам 3 (прописью - три) примера почему звездочка - плохо.
11 янв 10, 07:50    [8163347]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на вставку данных  [new]
мимо шел я
Guest
Гость888
я уже привел вам 3 (прописью - три) примера почему звездочка - плохо.

Зачем вы так себя перетруждали. Приведите один, но объясняющий, чем плоха звездочка в конкретном запросе
if exists(select * from ...)
иначе я начну сомневаться в том, что вы вообще что-то знаете.
11 янв 10, 08:11    [8163365]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить