powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тригеры или хранимые процедуры ... ?
25 сообщений из 34, страница 1 из 2
Тригеры или хранимые процедуры ... ?
    #32041765
Фотография XDefender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, возможно один из важных вопросов, возможно немного философский, но хотелось бы от философии отойти.

Где и как нужно использовать тригеры, а где хранимые пройедуры?

К примеру у меня база учета товара, выписки товара, выписки платежек (так мелкий документооборот), учет клиентов, поставщиков, склад.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041768
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу тригеров, у меня лично очень необычный (наверно) взгляд.
Уточню , тригер , это такой работяга, который незаметно для всех висит на таблице и отрабатывает не зависимо от того хочет ли пользовател или нет .
На мой взгляд это не лучший способ избавиться от проблем, т.к. иногда он может делать то чего и не ожидалось ...
его невидно , следовательно про него можно случайно забыть , по этой причине на мой взгляд использование SP гораздо лучше , если требуется точность выполнения, то можно использовать транзакцию .. и опятьже все написано прозрачно и легкопонимаемо ...
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041773
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры лучьше использовать только для поддержки сложной целостности БД
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041781
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
каждое для своего ...

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

то триггеры достаточно удобны

например в случае склада при расходовании или получении товара можно триггерами формировать таблицу остатков, при этом вам не понадобится каждый раз считать остатки
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041786
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Классическое назначение триггеров это выполнение наиболее формализованных и мало интеллектуальных работ
пример: записать в поле last_info getdate()
Для запуска триггера должно произойти событие ... вот и инициализирует его процедура.


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

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

Пример работы процедуры и триггера: Добавляю юзера - это процедура
процедура инициирует запуск триггера, который добавляет таблицу прав право паблик (по умолчанию)

на пальцах процедура действие, а триггер помощник.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041791
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры и констрейнты предназначены для поддержки целостности данных, как с точки зрения реляционной теории так и с точки зрения бизнес правил.
Все ограничения которые можно реализовать констрейнтами лучше именно таким способом и реализовывать т.к. этот способ производительней.
Бизнес логику уже можно организовывать с помощью процедур или промежуточного слоя, на мой взгляд лучше все же все что можно организовать процедурами, клиент должен быть максимально тонким.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041801
LeVo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Genady
В реляционной теории про триггеры ничего нет.
Что такое бизнес-логика?
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041816
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В реляционной теории про триггеры ничего нет.

В реляционной теории есть такое понятие как ссылочная целостность, которую можно поддерживать с помощью DRI и с помощью триггеров, DRI предпочтительней.

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

Бизнес логика это правила обработки данных, которые соотвествуют кокретному бизнесу, например когда приходит партия товара нужно записать его количество, наименование, тип упаковки, рассчитать остатки если они храняться а не пересчитываются каждый раз и т.п.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041817
Почемучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Genady
...
Все ограничения которые можно реализовать констрейнтами лучше именно таким способом и реализовывать т.к. этот способ производительней.
...
а вот тут можно поподробнее ???
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041818
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так мы потихоньку дойдем и до вопроса "что такое таблицы" :)...
А по сути... Триггер и хранимая процедура - суть одно и то же. Только вызов хранимой процедуры инициирует клиент (или другая хранимая процедура), а запуск триггера инициирует ОПЕРАЦИЯ (вставки / удаления / обновления). Одним словом, триггер - это процедура обработки события.
Если то, событие, которое обрабатиывает риггер, происходит слишком чсато, то нельзя триггер делать тежеловесным - будет медленно ворочаться. Особенно, если триггер сделан с использованием временных таблиц (или табличных переменных), то при каждом его вызове будет происходить его перекомпиляция, что может вызывать очень существенные задержки (у меня встречались триггеры на 1000 строк).
Вне зависимости от того, используете вы триггеры или хранимые процедуры, если в коде много ветвлений, и есть громоздкие куски кода, которые выполняются довольно редко при стечении каких-то особых обстоятельств, необходимо по возможности выделять подобные куски кода в отдельные ХП и вызывать их из основной ХП только в том случае, если в них возникла необходимость. Особенно это касается кусков кода с использованием временных таблиц и табличных переменных (которые могут приводить к перекомпиляции во время вызова). Выполнить это требование непросто, если речь идет о триггере. Дело в том, что таблицы Inserted и Deleted за пределами триггера недоступны, а в триггере обычно работа производится именно с этими двумя таблицами. С другой стороны, вызвать хранимую процедуру, которая должна обработать не одиночные параметры, а некоторую совокупность записей (возможно, весьма объемную) так просто не удастся. В этом они проигрывают триггерам.

В общем и целом, как я понимаю, существуют две концепции. Первая подразуемвает в основном использование VIEW и триггеров. Она более универсальная, поскольку с VIEW можно работать с разных клиентов без мудреного клиентского интерфейса (на простых гридах, в которых непосредственно все и правится - можно делать творить хоть в EM, хоть в Excell). Вторая концепция подразумевает для каждой таблицы заводить ХП на добавление записи (одной!), на удаление записи (опять же одной!) и на модификацию записи (опять одной!). Еще может понадобиться ХП (или VIEW) просто на селект (не следует забывать, что ХП возвращает необновляемый Recordset). Она имеет свои преимущества и свои недостатки. Пара недостатков уже прозвучала - оперирование всегда одной записью и жесткая завязка на интерфейс вызова этих ХП. Сам администратор, пожелав выполнить какую-то операцию скопом непосредственно на таблицах в обход ХП, может здорово напортачить и даже не сразу об этом узнать (это к вопросу о бизнес-логике). Однако, у этой концепции есть и свои плюсы. Есть ряд операций, которые можно выполнять в ХП, но которые нельзя выполнять в UDF, во VIEW и в триггерах. Выигрыш первой концепции по сравнению со второй также меркнет при столкновении снекоторыми глюками ADO с вычисляемыми полями VIEW (их запрещено редактировать, хотя ко VIEW прицеплен instead-триггер, который, в принципе, смог бы сделать что-то полезное с отредактированным значением, оставив при этом поле вычисляемым - тут ИМХО MS недодумала). Внимательно изучив эти ограничения и определившись с тем, собираетесь ли вы использовать те операции, которые делают вторую концепцию более выигрышной, и нужно выбрать конкретный вариант.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041819
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот тут можно поподробнее ???

Можно и поподробнее. :-)
Констрейнт отрабатывает до вставки или обновления данных, а триггер после.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041857
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь есть некоторая неточность.
триггер может запускаться как до (INSTEAD OF UPDATE), так и после (FOR UPDATE | AFTER UPDATE) обновления данных.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041862
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь есть некоторая неточность.

Действительно неточность, триггера INSTEAD OF это триггера вместо, а не до. Разница есть. Кроме того, такие триггера есть только начиная с версии 8.0
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041863
LeVo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Genady

Про ссылочную целостность в рел. теории есть, а как она реализуется не регламентируется - это зависит от конкретной СУБД.
Триггер может сработать и до вставки, смотря как он определен.
Под бизнес-логикой Вы понимаете бизнес-процессы? В общем случае хранимая процедура реализует часть бизнес-процесса, оставшаяся часть, например, запрос данных от пользователя, реализуется вне ее.

Not to Genady
Бизнес-правила суть собственно данные, домены на которых они построены, отношения между данными и ограничения на данные.
Так как любая СУБД не является 100% рел.продуктом, то не всегда можно декларировать ограничения, а приходится их программировать, например, создавать триггеры. В СУБД DB2 можно декларировать ограичения на уровне СУБД - в этом смысле она достаточно развита.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041865
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как она реализуется не регламентируется - это зависит от конкретной СУБД.

А я о конкретной СУБД и говорил.

В общем случае хранимая процедура реализует часть бизнес-процесса,

По моему это очивидно, или я слишком непонятно говорил?

В СУБД DB2 можно декларировать ограичения на уровне СУБД

Что значит на уровне СУБД? Констрейнты в MS SQL это не на уровне СУБД?
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041869
Dominic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ по существу вопроса - "в зависимости от того, с какой точки зрения в текущий момент смотрит разработчик на будущее приложение". Кто понимает, дальше может не читать.

Такие понятия как "наряд не может быть закрыт, если еще не закрыты допуска к рабочему месту" более доступны для понимания чем процесс оформления окончания работ в целом. Вот эта "элементарщина" для тригера самое то. Как бы в дальнейшем разработчику с его гипертрофированным воображением не захотелось реализовать процесс закрытия наряда - полностью на клиенте или через хранимую процедуру - блокировочка-то уже реализована, ну, и помогает сэкономить время отладки, выкидывая всякие там RAISERROR с информацией. Или такая жуткая вещь, которая происходит в нарушении всех правил эксплуатации ПО, как модификация серверного кода или данных на живой системе (покажите мне того, кто этого не делал) - тригер здесь последний бастион зашиты.
Начинающим разработчикам систем клиент-сервер на нашем предприятии я говорю примерно следующее: напишите серверную часть приложения так, чтобы как потом использующий и модифицирующий данные процесс "не прыгал", он ничего бы не разрушил. Когда решаешь задачу в таком разрезе, "тригер" как средство реализации стоит на первом месте. Когда переходишь к обеспечению бизнес-процессов - на первом месте стоят хранимые процедуры.

А насчет того, что разработчик о существовании тригера забывает - так это же хорошо! Представьте, реализует он через SP списание товаров со склада - "так, сюда вставить, здесь уменьшить..." - сделал, счастливый такой... А ему тут из тригера "А где накладная?". И разочарование от того, что код сразу не пошел, меркнет перед радостью известности о месте проблемы.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041870
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dominic хорошо все описал, вот так и надо делать, только я по старой привычке все же максимальное количество проверок стараюсь запихнуть в констрейнты, а триггера использую если констрейнтом не получиться. Потому что в семерке констрейнт точно быстрее, а в 2000 по крайней мере не медленнее триггера.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041889
ElVo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TO Genady

В SQL сервере существуют ограничения 2 уровней: уровень колонки и уровень таблицы. Остальные 2 уровня ограничений Вы знаете, так как часто ссылаетесь на рел.теорию, которую Вы хорошо изучили.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041895
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQL сервере существуют ограничения 2 уровней: уровень колонки и уровень таблицы. Остальные 2 уровня ограничений Вы знаете, так как часто ссылаетесь на рел.теорию, которую Вы хорошо изучили.

Это ответ по вопросу об ограничениях на уровне СУБД?
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041916
LeVo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Genady
Да
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041919
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 LeVo

Как выглядят ограничения на уровне колонки и таблицы мне понятно, нельзя ли поподробнее рассказать как в DB2 задаются ограничения на уровне СУБД.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041942
AlexP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры имеют серьезный недостаток, об этом вскользь упоминалось в этом топике. Если Вы автоматизируете собственную контору, тогда ничего, а вот если пишете на заказ, триггер можно забыть при очередном upgrade'е, и ничего не будет заметно, а потом будет поздно.
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041968
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Млин, объясните тупому человеку (мне), как это можно забыть триггер ? Вот как при разработке забывают триггера? А stored proc вы не забываете где-нибудь в кармане?
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041978
Tulkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как насчет формулы
триггер+бизнес_логика+бльшая_таблица= ТОРМОЗА
...
Рейтинг: 0 / 0
Тригеры или хранимые процедуры ... ?
    #32041985
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
согласен с Tulkin.... причем оч. часто БОЛЬШИЕ ТОРМОЗА...
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тригеры или хранимые процедуры ... ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]