|
|
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Вот, возможно один из важных вопросов, возможно немного философский, но хотелось бы от философии отойти. Где и как нужно использовать тригеры, а где хранимые пройедуры? К примеру у меня база учета товара, выписки товара, выписки платежек (так мелкий документооборот), учет клиентов, поставщиков, склад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 11:23:59 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
По поводу тригеров, у меня лично очень необычный (наверно) взгляд. Уточню , тригер , это такой работяга, который незаметно для всех висит на таблице и отрабатывает не зависимо от того хочет ли пользовател или нет . На мой взгляд это не лучший способ избавиться от проблем, т.к. иногда он может делать то чего и не ожидалось ... его невидно , следовательно про него можно случайно забыть , по этой причине на мой взгляд использование SP гораздо лучше , если требуется точность выполнения, то можно использовать транзакцию .. и опятьже все написано прозрачно и легкопонимаемо ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 11:32:00 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Триггеры лучьше использовать только для поддержки сложной целостности БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 11:44:24 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
каждое для своего ... например: если время на обработку обновления записи в таблицу не критично , а результат выборки нужно получить быстро то триггеры достаточно удобны например в случае склада при расходовании или получении товара можно триггерами формировать таблицу остатков, при этом вам не понадобится каждый раз считать остатки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 11:57:30 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Классическое назначение триггеров это выполнение наиболее формализованных и мало интеллектуальных работ пример: записать в поле last_info getdate() Для запуска триггера должно произойти событие ... вот и инициализирует его процедура. Я говорю о классическом подходе. конечно можно все написать наоборот и оно будет работать - но .... Основное достоинство триггера - является его слабым местом. Его написал и забыл. Хотя если вы разработчик то, в толк не могу взять, как можно об этом забыть. Выходит вы не продумали структуру данных ... ссылочную целостность и т.д. Пример работы процедуры и триггера: Добавляю юзера - это процедура процедура инициирует запуск триггера, который добавляет таблицу прав право паблик (по умолчанию) на пальцах процедура действие, а триггер помощник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 12:03:07 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Триггеры и констрейнты предназначены для поддержки целостности данных, как с точки зрения реляционной теории так и с точки зрения бизнес правил. Все ограничения которые можно реализовать констрейнтами лучше именно таким способом и реализовывать т.к. этот способ производительней. Бизнес логику уже можно организовывать с помощью процедур или промежуточного слоя, на мой взгляд лучше все же все что можно организовать процедурами, клиент должен быть максимально тонким. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 12:12:39 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
To Genady В реляционной теории про триггеры ничего нет. Что такое бизнес-логика? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 12:39:18 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
В реляционной теории про триггеры ничего нет. В реляционной теории есть такое понятие как ссылочная целостность, которую можно поддерживать с помощью DRI и с помощью триггеров, DRI предпочтительней. Бизнес правила это простые ограничения на данные, которые соответствут конкретной предметной области, например количество товара в пришедшей партии не может быть отрицательным, дата заключения договора не можеть быть меньше даты окончания договора и т.п. Бизнес логика это правила обработки данных, которые соотвествуют кокретному бизнесу, например когда приходит партия товара нужно записать его количество, наименование, тип упаковки, рассчитать остатки если они храняться а не пересчитываются каждый раз и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 13:25:56 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
To Genady ... Все ограничения которые можно реализовать констрейнтами лучше именно таким способом и реализовывать т.к. этот способ производительней. ... а вот тут можно поподробнее ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 13:26:43 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Так мы потихоньку дойдем и до вопроса "что такое таблицы" :)... А по сути... Триггер и хранимая процедура - суть одно и то же. Только вызов хранимой процедуры инициирует клиент (или другая хранимая процедура), а запуск триггера инициирует ОПЕРАЦИЯ (вставки / удаления / обновления). Одним словом, триггер - это процедура обработки события. Если то, событие, которое обрабатиывает риггер, происходит слишком чсато, то нельзя триггер делать тежеловесным - будет медленно ворочаться. Особенно, если триггер сделан с использованием временных таблиц (или табличных переменных), то при каждом его вызове будет происходить его перекомпиляция, что может вызывать очень существенные задержки (у меня встречались триггеры на 1000 строк). Вне зависимости от того, используете вы триггеры или хранимые процедуры, если в коде много ветвлений, и есть громоздкие куски кода, которые выполняются довольно редко при стечении каких-то особых обстоятельств, необходимо по возможности выделять подобные куски кода в отдельные ХП и вызывать их из основной ХП только в том случае, если в них возникла необходимость. Особенно это касается кусков кода с использованием временных таблиц и табличных переменных (которые могут приводить к перекомпиляции во время вызова). Выполнить это требование непросто, если речь идет о триггере. Дело в том, что таблицы Inserted и Deleted за пределами триггера недоступны, а в триггере обычно работа производится именно с этими двумя таблицами. С другой стороны, вызвать хранимую процедуру, которая должна обработать не одиночные параметры, а некоторую совокупность записей (возможно, весьма объемную) так просто не удастся. В этом они проигрывают триггерам. В общем и целом, как я понимаю, существуют две концепции. Первая подразуемвает в основном использование VIEW и триггеров. Она более универсальная, поскольку с VIEW можно работать с разных клиентов без мудреного клиентского интерфейса (на простых гридах, в которых непосредственно все и правится - можно делать творить хоть в EM, хоть в Excell). Вторая концепция подразумевает для каждой таблицы заводить ХП на добавление записи (одной!), на удаление записи (опять же одной!) и на модификацию записи (опять одной!). Еще может понадобиться ХП (или VIEW) просто на селект (не следует забывать, что ХП возвращает необновляемый Recordset). Она имеет свои преимущества и свои недостатки. Пара недостатков уже прозвучала - оперирование всегда одной записью и жесткая завязка на интерфейс вызова этих ХП. Сам администратор, пожелав выполнить какую-то операцию скопом непосредственно на таблицах в обход ХП, может здорово напортачить и даже не сразу об этом узнать (это к вопросу о бизнес-логике). Однако, у этой концепции есть и свои плюсы. Есть ряд операций, которые можно выполнять в ХП, но которые нельзя выполнять в UDF, во VIEW и в триггерах. Выигрыш первой концепции по сравнению со второй также меркнет при столкновении снекоторыми глюками ADO с вычисляемыми полями VIEW (их запрещено редактировать, хотя ко VIEW прицеплен instead-триггер, который, в принципе, смог бы сделать что-то полезное с отредактированным значением, оставив при этом поле вычисляемым - тут ИМХО MS недодумала). Внимательно изучив эти ограничения и определившись с тем, собираетесь ли вы использовать те операции, которые делают вторую концепцию более выигрышной, и нужно выбрать конкретный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 13:30:26 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
а вот тут можно поподробнее ??? Можно и поподробнее. :-) Констрейнт отрабатывает до вставки или обновления данных, а триггер после. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 13:30:59 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
здесь есть некоторая неточность. триггер может запускаться как до (INSTEAD OF UPDATE), так и после (FOR UPDATE | AFTER UPDATE) обновления данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 14:35:13 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
здесь есть некоторая неточность. Действительно неточность, триггера INSTEAD OF это триггера вместо, а не до. Разница есть. Кроме того, такие триггера есть только начиная с версии 8.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 14:50:01 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
To Genady Про ссылочную целостность в рел. теории есть, а как она реализуется не регламентируется - это зависит от конкретной СУБД. Триггер может сработать и до вставки, смотря как он определен. Под бизнес-логикой Вы понимаете бизнес-процессы? В общем случае хранимая процедура реализует часть бизнес-процесса, оставшаяся часть, например, запрос данных от пользователя, реализуется вне ее. Not to Genady Бизнес-правила суть собственно данные, домены на которых они построены, отношения между данными и ограничения на данные. Так как любая СУБД не является 100% рел.продуктом, то не всегда можно декларировать ограничения, а приходится их программировать, например, создавать триггеры. В СУБД DB2 можно декларировать ограичения на уровне СУБД - в этом смысле она достаточно развита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 14:50:29 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
а как она реализуется не регламентируется - это зависит от конкретной СУБД. А я о конкретной СУБД и говорил. В общем случае хранимая процедура реализует часть бизнес-процесса, По моему это очивидно, или я слишком непонятно говорил? В СУБД DB2 можно декларировать ограичения на уровне СУБД Что значит на уровне СУБД? Констрейнты в MS SQL это не на уровне СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 14:55:08 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Ответ по существу вопроса - "в зависимости от того, с какой точки зрения в текущий момент смотрит разработчик на будущее приложение". Кто понимает, дальше может не читать. Такие понятия как "наряд не может быть закрыт, если еще не закрыты допуска к рабочему месту" более доступны для понимания чем процесс оформления окончания работ в целом. Вот эта "элементарщина" для тригера самое то. Как бы в дальнейшем разработчику с его гипертрофированным воображением не захотелось реализовать процесс закрытия наряда - полностью на клиенте или через хранимую процедуру - блокировочка-то уже реализована, ну, и помогает сэкономить время отладки, выкидывая всякие там RAISERROR с информацией. Или такая жуткая вещь, которая происходит в нарушении всех правил эксплуатации ПО, как модификация серверного кода или данных на живой системе (покажите мне того, кто этого не делал) - тригер здесь последний бастион зашиты. Начинающим разработчикам систем клиент-сервер на нашем предприятии я говорю примерно следующее: напишите серверную часть приложения так, чтобы как потом использующий и модифицирующий данные процесс "не прыгал", он ничего бы не разрушил. Когда решаешь задачу в таком разрезе, "тригер" как средство реализации стоит на первом месте. Когда переходишь к обеспечению бизнес-процессов - на первом месте стоят хранимые процедуры. А насчет того, что разработчик о существовании тригера забывает - так это же хорошо! Представьте, реализует он через SP списание товаров со склада - "так, сюда вставить, здесь уменьшить..." - сделал, счастливый такой... А ему тут из тригера "А где накладная?". И разочарование от того, что код сразу не пошел, меркнет перед радостью известности о месте проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 14:59:18 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Dominic хорошо все описал, вот так и надо делать, только я по старой привычке все же максимальное количество проверок стараюсь запихнуть в констрейнты, а триггера использую если констрейнтом не получиться. Потому что в семерке констрейнт точно быстрее, а в 2000 по крайней мере не медленнее триггера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 15:06:54 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
TO Genady В SQL сервере существуют ограничения 2 уровней: уровень колонки и уровень таблицы. Остальные 2 уровня ограничений Вы знаете, так как часто ссылаетесь на рел.теорию, которую Вы хорошо изучили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 15:29:53 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
В SQL сервере существуют ограничения 2 уровней: уровень колонки и уровень таблицы. Остальные 2 уровня ограничений Вы знаете, так как часто ссылаетесь на рел.теорию, которую Вы хорошо изучили. Это ответ по вопросу об ограничениях на уровне СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 15:55:48 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
To Genady Да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 16:28:13 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
2 LeVo Как выглядят ограничения на уровне колонки и таблицы мне понятно, нельзя ли поподробнее рассказать как в DB2 задаются ограничения на уровне СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 16:39:36 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Триггеры имеют серьезный недостаток, об этом вскользь упоминалось в этом топике. Если Вы автоматизируете собственную контору, тогда ничего, а вот если пишете на заказ, триггер можно забыть при очередном upgrade'е, и ничего не будет заметно, а потом будет поздно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 17:18:55 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
Млин, объясните тупому человеку (мне), как это можно забыть триггер ? Вот как при разработке забывают триггера? А stored proc вы не забываете где-нибудь в кармане? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 18:10:20 |
|
||
|
Тригеры или хранимые процедуры ... ?
|
|||
|---|---|---|---|
|
#18+
А как насчет формулы триггер+бизнес_логика+бльшая_таблица= ТОРМОЗА ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2002, 18:27:38 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32041863&tid=1820974]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 351ms |

| 0 / 0 |
