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

Откуда:
Сообщений: 31
Добрый день!

Таблица E2Device
| id | DeviceID | ParamID | Ustavka | Text_ON | Text_OFF | Cat | Pr | Flag | Comment |
| 2000 | 936 | 9981 | >40 | Т1 больше 40 | Устранено: Т1 больше 40 | 3 | 50 | True | узел № 1 |

CREATE TABLE "E2Device" (
	"id" INT NOT NULL DEFAULT NULL,
	"DeviceID" INT NULL DEFAULT NULL,
	"ParamID" INT NULL DEFAULT NULL,
	"Ustavka" VARCHAR(10) NULL DEFAULT NULL,
	"Text_ON" VARCHAR(100) NULL DEFAULT NULL,
	"Text_OFF" VARCHAR(100) NULL DEFAULT NULL,
	"Cat" INT NULL DEFAULT NULL,
	"Pr" INT NULL DEFAULT NULL,
	"Flag" BIT NULL DEFAULT NULL,
	"Comment" VARCHAR(200) NULL DEFAULT NULL,
	PRIMARY KEY ("id")
);

CREATE TABLE "EventsHelp" (
	"Code" INT NOT NULL DEFAULT NULL,
	"Type" INT NOT NULL DEFAULT NULL,
	"Text" VARCHAR(100) NULL DEFAULT NULL,
	"TextRst" VARCHAR(100) NULL DEFAULT NULL,
	"Cat" INT NOT NULL DEFAULT '0',
	"Pr" INT NOT NULL DEFAULT '0',
	"Flags" INT NOT NULL DEFAULT '0',
	PRIMARY KEY ("Code")
);


Триггер 1:
При создании записи в таблице E2Device при Flag=1 или NULL выполнять запись в таблицу EventsHelp:
EventsHelp.Code = E2Device.id
EventsHelp.Type = 2
EventsHelp.Text = E2Device.Text_ON
EventsHelp.TextRst = E2Device.Text_OFF
EventsHelp.Cat = E2Device.Cat
EventsHelp.Pr = E2Device.Pr

При изменении действующей записи в таблице E2Device, выполнять те же изменения в таблицу EventsHelp по E2Device.id привязке.

Я простые SQL запросы умею делать, а вот так должен выглядеть триггер умеющий делать выше описанное не пойму...
Помогите пожалуйста!
12 дек 14, 15:08    [16989166]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
kristow
Я простые SQL запросы умею делать, а вот так должен выглядеть триггер умеющий делать выше описанное не пойму...

В триггере тоже будут простые запросы - INSERT/UPDATE/DELETE
Вы сейчас, без триггера, в состоянии их написать ?
12 дек 14, 15:18    [16989256]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
kristow
Member

Откуда:
Сообщений: 31
Glory,

да,
вот:
INSERT INTO dbo.E2Device VALUES (937, 9982, '<55','Т2 меньше 55','Устранено: Т2 меньше 55',3,50,'True')

UPDATE dbo.E2Device SET ParamID = 9999 WHERE DeviceID=937
12 дек 14, 15:34    [16989407]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
kristow
INSERT INTO dbo.E2Device VALUES (937, 9982, '<55','Т2 меньше 55','Устранено: Т2 меньше 55',3,50,'True')


UPDATE dbo.E2Device SET ParamID = 9999 WHERE DeviceID=937

Какой из этих запросов делает "записи в таблице E2Device при Flag=1 или NULL выполнять запись в таблицу EventsHelp:" ?
12 дек 14, 15:36    [16989423]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
ваши запросы вызовут ошибки выполнения на структуре таблицы, указанной вами ранее
12 дек 14, 15:36    [16989425]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Mairos
Member

Откуда:
Сообщений: 555
kristow,
Как-то так ..
USE garbage;
GO
IF OBJECT_ID ('trg_E2Device_ins', 'TR') IS NOT NULL
   DROP TRIGGER trg_E2Device_ins;
GO
USE имябазы 
GO

CREATE TRIGGER trg_E2Device_ins
ON E2Device
AFTER INSERT
AS 
	insert into EventsHelp (Code, Type, Text, TextRst, Cat, Pr)
	select id, 2, Text_ON, Text_OFF, Cat, Pr 
	from inserted
GO
-------------
IF OBJECT_ID ('trg_E2Device_upd', 'TR') IS NOT NULL
   DROP TRIGGER trg_E2Device_upd;
GO
CREATE TRIGGER trg_E2Device_upd
ON E2Device
AFTER UPDATE 
AS 
	update EventsHelp 
	set Code = i.id, Type = 2, Text = i.Text_ON, TextRst = i.Text_OFF, Cat = i.Cat, Pr = i.Pr
	from inserted i 
	join EventsHelp e on e.code = i.id
GO
12 дек 14, 15:45    [16989482]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Mairos
Member

Откуда:
Сообщений: 555
Прошу прощения.. условия про "flag=1 или NULL" не учитывал
12 дек 14, 15:49    [16989519]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
kristow
Member

Откуда:
Сообщений: 31
Konst_One,

Запросы рабочие, перед публикацией я их проверил, создание и изменение записи выполнилось.

Glory ,
Вот запрос на добавление записи в dbo.EventsHelp
INSERT INTO dbo.EventsHelp VALUES (2001, 2,'Т2 меньше 55','Устранено: Т2 меньше 55',3,50)


Я вопрос задавал, потому что не пойму как написать триггер, чтобы он при создании записи в E2Device выполнял INSERT INTO dbo.EventsHelp.
А при изменении одной из записи, выполнить такое же изменение...
12 дек 14, 15:51    [16989552]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
kristow
Вот запрос на добавление записи в dbo.EventsHelp

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

kristow
Я вопрос задавал, потому что не пойму как написать триггер, чтобы он при создании записи в E2Device выполнял INSERT INTO dbo.EventsHelp.

Еще раз
Триггер - это не волшебная команда.
Триггер - это последовательность стандартных команд. Если вы не умеете писать простые команды, то нет смысла объяснять вам, как сделать триггер
12 дек 14, 15:53    [16989580]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
kristow
Member

Откуда:
Сообщений: 31
Mairos,

Спасибо большое, проверил, все работает!
12 дек 14, 15:56    [16989604]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
kristow
Спасибо большое, проверил, все работает!

А деньги, обещанные в другом формуе, вы Mairos заплптите ?
12 дек 14, 15:56    [16989613]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
kristow
Konst_One,

Запросы рабочие, перед публикацией я их проверил, создание и изменение записи выполнилось.

Glory ,
Вот запрос на добавление записи в dbo.EventsHelp
INSERT INTO dbo.EventsHelp VALUES (2001, 2,'Т2 меньше 55','Устранено: Т2 меньше 55',3,50)



Я вопрос задавал, потому что не пойму как написать триггер, чтобы он при создании записи в E2Device выполнял INSERT INTO dbo.EventsHelp.
А при изменении одной из записи, выполнить такое же изменение...


CREATE TABLE "E2Device" (
	"id" INT NOT NULL DEFAULT NULL,
	"DeviceID" INT NULL DEFAULT NULL,
	"ParamID" INT NULL DEFAULT NULL,
	"Ustavka" VARCHAR(10) NULL DEFAULT NULL,
	"Text_ON" VARCHAR(100) NULL DEFAULT NULL,
	"Text_OFF" VARCHAR(100) NULL DEFAULT NULL,
	"Cat" INT NULL DEFAULT NULL,
	"Pr" INT NULL DEFAULT NULL,
	"Flag" BIT NULL DEFAULT NULL,
	"Comment" VARCHAR(200) NULL DEFAULT NULL,
	PRIMARY KEY ("id")
);

--поле Flag [b]bit[/b]
-- список полей в insert неверный

INSERT INTO dbo.E2Device VALUES (937, 9982, '<55','Т2 меньше 55','Устранено: Т2 меньше 55',3,50,'True')




это не могло работать
12 дек 14, 15:59    [16989639]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Mairos
Member

Откуда:
Сообщений: 555
kristow, для триггера по вставке, для учёта условия "flag"

USE имябазы;
GO
IF OBJECT_ID ('trg_E2Device_ins', 'TR') IS NOT NULL
   DROP TRIGGER trg_E2Device_ins;
GO
CREATE TRIGGER trg_E2Device_ins
ON E2Device
AFTER INSERT
AS 	
	insert into EventsHelp (Code, Type, Text, TextRst, Cat, Pr)
	select id, 2, Text_ON, Text_OFF, Cat, Pr 
	from inserted where flag = 1 or flag is null
GO
12 дек 14, 16:06    [16989717]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Mairos
Member

Откуда:
Сообщений: 555
Glory, неть.. не надо денег! ))) За что тут платить-то? Я из альтруизма чистого ))))
12 дек 14, 16:07    [16989732]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
Mairos
Glory, неть.. не надо денег! ))) За что тут платить-то? Я из альтруизма чистого ))))

Просто ТС поместил соответствующее задание в разделе Работа.
Значит ему не нужны знание, ему нужен готовый продукт.
12 дек 14, 16:09    [16989751]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Mairos
Member

Откуда:
Сообщений: 555
Glory, ммм ..))) Так вот где собака порылась! Как говаривал бывший президент СССР ))))))))))
12 дек 14, 16:15    [16989821]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
kristow
Member

Откуда:
Сообщений: 31
Mairos,

Спасибо :)

Да, я не совсем пойму как работать в одном SQL запросе с разными таблицами.
т.е. командf SELECT с несколькими таблица понятна:
SELECT d.DeviceID, d.ParamID, d1.Time, d1.ValOut
FROM
    dbo.MeasureID d
    INNER JOIN dbo.MeasuresCurrent d1 ON (d.ID=d1.MeasureID)
WHERE
    d.DeviceID =936 AND
    d.ParamID =9981

А вот насчет Update и insert.

Думал по аналогии сделать второй триггер, который проверяет условие.
Но там триггер читал переменные inserted i, т.е. значения, которые использовались в insert запросе.
А как обращаться к таблицам, которые в SQL действии (insert/update/delete) не участвовали?
12 дек 14, 16:37    [16990044]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
kristow
Member

Откуда:
Сообщений: 31
CREATE TABLE "MeasuresCurrent" (
	"MeasureID" INT NOT NULL DEFAULT NULL,
	"Timemark" SMALLDATETIME NULL DEFAULT NULL,
	"Time" DATETIME NOT NULL DEFAULT NULL,
	"ValOut" FLOAT NULL DEFAULT NULL,
	"logTime" DATETIME NOT NULL DEFAULT NULL,
	"chgTime" DATETIME NOT NULL DEFAULT NULL,
	"Status" SMALLINT NOT NULL DEFAULT NULL,
	PRIMARY KEY ("MeasureID")
)

CREATE TABLE "MeasureID" (
	"ID" INT NOT NULL DEFAULT NULL,
	"ParamID" INT NOT NULL DEFAULT NULL,
	"Source" TINYINT NOT NULL DEFAULT NULL,
	"Kind" TINYINT NOT NULL DEFAULT NULL,
	"Range" TINYINT NOT NULL DEFAULT NULL,
	"Tarif" TINYINT NOT NULL DEFAULT NULL,
	"Flags" TINYINT NOT NULL DEFAULT NULL,
	"DeviceID" INT NULL DEFAULT NULL,
	PRIMARY KEY ("ID")
)

CREATE TABLE "E2Status" (
	"DeviceID" INT NULL DEFAULT NULL,
	"Code" INT NULL DEFAULT NULL,
	"UP" INT NULL DEFAULT NULL,
	"Time" DATETIME NULL DEFAULT NULL
)

SELECT d.DeviceID, d.ParamID, d1.Time, d1.ValOut
FROM
    dbo.MeasureID d
    INNER JOIN dbo.MeasuresCurrent d1 ON (d.ID=d1.MeasureID)
WHERE
    d.DeviceID =936 AND
    d.ParamID =9981


Триггер следит только за изменениями d1.ValOut. Из выше приведенного запроса, выводится всегда только одна строка, либо не одной (это при неверной фильтрации).
Необходимо используя данные из таблицы E2Device выподнять проверку уставки с ValOut (пример: ValOut = 56, if (ValOut > 40) Then), если условые выполняется,
то выполнить запрос с подстановкой из E2Device "EXEC SetEvent @DeviceID=936, @Code=2000, @Up=1, @Val=0;" и сделать запись в таблице E2Status.

Записи в таблице E2Status если связки DeviceID и Code нет, создать новую, если связка есть, то выолнить ее обновление.
E2Status.Time - указывать дату изменения записи.

ValOut проверять при каждой записи в таблицу MeasuresCurrent. При выполнении условия из E2Device выполнять запись "EXEC SetEvent @DeviceID=936, @Code=2000, @Up=1, @Val=0;" однократно.
т.е. только при первом переходе парога, последующие выполнения условый проверять с таблицей E2Status, если E2Status.UP = 1, то запрос "EXEC SetEvent @DeviceID=936, @Code=2000, @Up=1, @Val=0;" не выполнять.

Такая же логика при окончании выполнения условия (ValOut > 40), выполнить запрос "EXEC SetEvent @DeviceID=936, @Code=2000, @Up=0, @Val=0;" и сделать запись в таблице E2Status.

P.S. Я писал в рубрику работы, т.к. не находил как правильно прописать триггеры... Я учусь на примерах кода. Когда ясна логика кода, начинаю делать подобное самостоятельно...
12 дек 14, 16:41    [16990091]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
автор
А вот насчет Update и insert.


То же самое, но пишете update вместо select.
12 дек 14, 16:41    [16990094]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Mairos
Member

Откуда:
Сообщений: 555
kristow,

update EventsHelp 
	set Code = i.id, Type = 2, Text = i.Text_ON, TextRst = i.Text_OFF, Cat = i.Cat, Pr = i.Pr
	from inserted i 
	join EventsHelp e on e.code = i.id


в данном случае вместо "inserted" можно поставить имя той таблицы из которой надо брать значения для "update" и получите запрос на update вне триггера.
"Inserted" в вашем случае это та таблица, на которую "повешен" триггер. Точнее набор вставленных в эту таблицу записей, датасет, говоря языком баз данных. Ну аналогично по удалённым "deleted" и т.д.
12 дек 14, 16:47    [16990141]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
kristow
Member

Откуда:
Сообщений: 31
Mairos,

да, это я понял.
Поправьте пожалуйста как правильно должно быть? Условие правильно написал?
CREATE TRIGGER trg_Current_upd
ON MeasuresCurrent
AFTER insert, update, delete
AS
	if((SELECT ParamID FROM dbo.MeasureID WHERE ID =i.MeasureID AND Kind =0)==((SELECT ParamID FROM dbo.E2Device)){
		123
	}
	from inserted i 
GO
12 дек 14, 16:55    [16990214]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
это не MS SQL синтаксис
12 дек 14, 16:56    [16990225]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
JeStone
Member

Откуда:
Сообщений: 248
kristow,
Вы бы прежде чем спрашивать хоть попробовали запустить код. Тут же ересь полная написана.
12 дек 14, 16:58    [16990244]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
kristow
Member

Откуда:
Сообщений: 31
Буду признателен ссылку на статью, или подскажите как это должно выглядеть в MS SQL синтаксисе...
12 дек 14, 17:04    [16990322]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с триггером  [new]
Mairos
Member

Откуда:
Сообщений: 555
kristow, вам SQL нужен для работы - серьёзно изучайте. А так... я не понял, что вы хотите сделать (((
12 дек 14, 17:27    [16990551]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить