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

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
Задача следующая:
Нужно создать триггер, который будет автоматически сохранять данные в файл, если выполняется определенное условие (s.ID = '19' -далее по коду)
есть табличка -
  [Users].[dbo].[User] AS u
 INNER JOIN  [Users].[dbo].[UserService] AS us ON u.ID = us.UserID
  INNER JOIN [Users].[dbo].[Service] AS s ON us.UserServiceDictID = s.ID
 where s.ID = '19'

необходимое условие в таблице [Users].[dbo].[Service]

т.е. нужно создать триггер на INSERT, сделать проверку есть ли это условие, если есть - то сохраняем в файл с:\grant
Прошу помочь мне в этом, заранее спасибо!
27 дек 11, 18:59    [11835055]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
1. За триггер, пишущий в файл, увольняют сразу.
2. Что надо писать в файл совершенно не понятно.
3. Каковым должно быть содержимое файла, если ваш триггер одновременно сработает в нескольких сессиях?
27 дек 11, 19:33    [11835166]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
1. За триггер, пишущий в файл, увольняют сразу.
??? Прошу разъяснить
invm
2. Что надо писать в файл совершенно не понятно.

в файл нужно писать данные, в нашем случае это учетные записи, имеющие признак в таблице [Users].[dbo].[Service] ID = '19'
формат: в строку поля учетной записи, через Enter следующая учетная запись
27 дек 11, 19:41    [11835207]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Александр52
нужно создать триггер на INSERT, сделать проверку есть ли это условие, если есть - то сохраняем в файл с:\grant
написать CLR или использовать xp_cmdshell

Александр52
1. За триггер, пишущий в файл, увольняют сразу.
??? Прошу разъяснить
Жуткая вещь получится, и нетривиальная для понимания и сопровождения.
27 дек 11, 20:16    [11835414]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
 SELECT   u.Name+'|'+'x'+'|'+'1p1E1712Z1'+'|'+'|'+'0'+'|'+'0'
  FROM [Users].[dbo].[User] u 
   INNER JOIN  [Users].[dbo].[UserService] AS us ON u.ID = us.UserID
  INNER JOIN [Users].[dbo].[Service] AS s ON us.UserServiceDictID = s.ID  where s.ID = '19'
  



Нужно при помощи триггера сохранять данные в этом формате.
т.е. если запись появилась - добавлять в файл
27 дек 11, 20:28    [11835461]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
т.е. просто нужно надо написать триггер, который по сути будет в столбец добавлять учетки при добавлении в табличку
27 дек 11, 20:40    [11835533]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Александр52
 SELECT   u.Name+'|'+'x'+'|'+'1p1E1712Z1'+'|'+'|'+'0'+'|'+'0'
  FROM [Users].[dbo].[User] u 
   INNER JOIN  [Users].[dbo].[UserService] AS us ON u.ID = us.UserID
  INNER JOIN [Users].[dbo].[Service] AS s ON us.UserServiceDictID = s.ID  where s.ID = '19'
  


Нужно при помощи триггера сохранять данные в этом формате.
т.е. если запись появилась - добавлять в файл
Вы сначала для себя поймите, что нужно сделать, распишите подробно алгоритм, дальше будет просто (метод записи в файл вам уже сказали).

Эта "запись" не может "появиться", потому что это не запись, а выборка из нескольких таблиц. То есть нужно отслеживать изменение записей в трёх таблицах, соответственно, нужно создать 9 триггеров на 3 таблицы (или немного меньше, если только "появление") с непростой обработкой и записью в файл.
27 дек 11, 20:42    [11835548]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Александр52
1. За триггер, пишущий в файл, увольняют сразу.
??? Прошу разъяснить

Триггер всегда выполняется в транзакции. Файловые операции относительно длительны и ресурсоемки.
Следовательно вы своим триггером увеличиваете длительность транзакции, что влечет за собой увеличение времени удержания блокировок, и, как следствие, снижение производительности и конкурентности доступа к данным.

Вы, случаем, не логгирование в текстовый файл строите?
27 дек 11, 21:03    [11835652]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
invm

Вы, случаем, не логгирование в текстовый файл строите?

Именно.
С данной задачей столкнулся впервые, а нужно все сделать как обычно вчера,отсюда небольшая паника и бессонная ночь..
27 дек 11, 21:41    [11835838]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Почему именно в файл? Чем не устроило логгирование в таблицу?
27 дек 11, 21:53    [11835886]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
Почему именно в файл? Чем не устроило логгирование в таблицу?
начальству так нужно, потом из этого файла в JOB-е будет сделат бат-ник, который будет запускаться врем от времени

ваш совет сдвинул меня с мертвой точки, попробовал:
  DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd

DECLARE @cmd sysname, @var sysname
SET @var = 'dir/p'
SET @cmd = @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd


правда файлик не нашел куда пишутся : )
27 дек 11, 22:17    [11835954]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Александр52
Почему именно в файл? Чем не устроило логгирование в таблицу?
начальству так нужно, потом из этого файла в JOB-е будет сделат бат-ник, который будет запускаться врем от времени

ваш совет сдвинул меня с мертвой точки, попробовал:
  DECLARE @cmd sysname, @var sysname
...


правда файлик не нашел куда пишутся : )



Ну если Вас всё устраивает.... тогда уж припишите к var_out.txt полный путь в папку, куда учётка (под которой запускается MSSQL) имеет доступ на запись...
27 дек 11, 22:47    [11836014]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Александр52
начальству так нужно, потом из этого файла в JOB-е будет сделат бат-ник, который будет запускаться врем от времени
Совершенно не понятно кто из кого чего делает и кто чего запускать будет. У вас начальство жестко регламентирует способы решения поставленной задачи?
Александр52
правда файлик не нашел куда пишутся : )
Выполните
exec xp_cmdshell 'dir .'
и узнаете.
27 дек 11, 22:52    [11836025]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
Ну если Вас всё устраивает.... тогда уж припишите к var_out.txt полный путь в папку, куда учётка (под которой запускается MSSQL) имеет доступ на запись...
как сказали - так и делаем : )
теперь еще знаем что можно записать файлик только в локальную папку)
27 дек 11, 22:53    [11836026]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
invm ,
Постановка задачи:Создать автоматизированное добавление учетных записей
Требования:

1. Добавить тригер на таблицу UserTable на Insert
1.1 В тригере проверяется есть ли у Юзера нужная роль
2.2 Если есть то сохраняем в файл с:\grant на server25
формат файла: 7723685207|x|1p1E1712Z1||0|0 где первое поле это имя записи
3.3 Каждая новая запись должна добавлятся в файл, разделитель Enter
4. В джобе синхронизации учеток добавить ещё один step который будет вызывать на server25 хранимку, которая в свою очередь будет вызывать bat файл С:\grant\user.bat
27 дек 11, 22:58    [11836043]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Александр52
invm ,
Постановка задачи:Создать автоматизированное добавление учетных записей
Требования:

1. Добавить тригер на таблицу UserTable на Insert
1.1 В тригере проверяется есть ли у Юзера нужная роль
2.2 Если есть то сохраняем в файл с:\grant на server25
формат файла: 7723685207|x|1p1E1712Z1||0|0 где первое поле это имя записи
3.3 Каждая новая запись должна добавлятся в файл, разделитель Enter
4. В джобе синхронизации учеток добавить ещё один step который будет вызывать на server25 хранимку, которая в свою очередь будет вызывать bat файл С:\grant\user.bat
Да, весело там у вас...
27 дек 11, 23:14    [11836075]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
Если "В джобе синхронизации учеток добавить ещё один step который будет вызывать на server25 хранимку" то почему бы этой процедуре и не формировать нужный файл, выбирая помеченные записи ?
27 дек 11, 23:19    [11836089]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
Glory
Если "В джобе синхронизации учеток добавить ещё один step который будет вызывать на server25 хранимку" то почему бы этой процедуре и не формировать нужный файл, выбирая помеченные записи ?

согласен с вами.
27 дек 11, 23:27    [11836111]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
В общем что у меня сейчас есть:
1) DECLARE @cmd sysname, @var sysname  
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > F:\var_out.txt'
EXEC master..xp_cmdshell @cmd

- скрипт, который производит выгрузку данных в txt формат.
2) SELECT   u.Name+'|'+'x'+'|'+'1p1E1712Z1'+'|'+'|'+'0'+'|'+'0'
  FROM [Users].[dbo].[User] u 
   INNER JOIN  [Users].[dbo].[UserService] AS us ON u.ID = us.UserID
  INNER JOIN [Users].[dbo].[Service] AS s ON us.UserServiceDictID = s.ID  where s.ID = '19'


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

3) есть знание что делать надо в хранимке INSERT

Теперь осталось все 3 пункта связать воедино

На самом деле спасибо вам огромное, уже за что что вы мне всё это подсказали и довели меня до этой точки!
27 дек 11, 23:35    [11836130]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
Хотя нет, с глори не согласен)
триггер быдет обновлять файлик на лету, а хранимка только когда её вызовут. Поэтому будет лучше триггером
27 дек 11, 23:58    [11836187]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
Александр52
триггер быдет обновлять файлик на лету, а хранимка только когда её вызовут. Поэтому будет лучше триггером

Ага, как в анекдоте
- Ну чем, чем лучше ?
- Чем процедура
28 дек 11, 00:00    [11836195]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
хватит флудить : )))
мне помощь нужна)
серьезно. Если делаю триггером на INSERT так примерно будет?
create trigger TR on DATABASE for insert
as
DECLARE @cmd sysname, @var sysname  

select case
when s.ID = '19' then 

SET @var = ' u.Name+'|'+'x'+'|'+'1p1E1712Z1'+'|'+'|'+'0'+'|'+'0''
FROM [Users].[dbo].[User] u 
   INNER JOIN  [Users].[dbo].[UserService] AS us ON u.ID = us.UserID
  INNER JOIN [Users].[dbo].[Service] AS s ON us.UserServiceDictID = s.ID  where s.ID = '19'
SET @cmd = 'echo ' + @var + ' > C:\gtant.txt'
EXEC master..xp_cmdshell @cmd

end
28 дек 11, 00:13    [11836223]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Glory
Member

Откуда:
Сообщений: 104751
Александр52
хватит флудить : )))
мне помощь нужна)

Вам нужно научиться правильно проектировать задачи


Александр52
серьезно. Если делаю триггером на INSERT так примерно будет?

Что мешает попробовать ?
28 дек 11, 00:16    [11836231]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
create trigger TR on DATABASE for insert
as
DECLARE @cmd sysname, @var sysname  

select case
when [services].dbo.id = '19' then 
@var =  u.Name+'|'+'x'+'|'+'1p1E1712Z1'+'|'+'|'+'0'+'|'+'0'
FROM [Users].[dbo].[User] u 
   INNER JOIN  [Users].[dbo].[UserService] AS us ON u.ID = us.UserID
  INNER JOIN [Users].[dbo].[Service] AS s ON us.UserServiceDictID = s.ID  where s.ID = '19'
SET @cmd = 'echo ' + @var + ' > C:\gtant.txt'
EXEC master..xp_cmdshell @cmd

--end


Сообщение 1098, уровень 15, состояние 1, процедура TR, строка 2
Заданы недопустимые типы событий в указанном целевом объекте.
Сообщение 102, уровень 15, состояние 1, процедура TR, строка 7
Неправильный синтаксис около конструкции "=".

пока максимально так получилось отладить...
я в верном направлении двигаюсь или следует сменить вектор?
28 дек 11, 00:39    [11836276]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Александр52
Постановка задачи:Создать автоматизированное добавление учетных записей
Требования:

1. Добавить тригер на таблицу UserTable на Insert
1.1 В тригере проверяется есть ли у Юзера нужная роль
Ну и бред :-)

Начальник понятно дурак, но вы тоже не видите, что при срабатывании триггера у пользователя гарантированно не будет нужной роли, и он никогда ничего не запишет в файл? :-)

Вы думаете, над вами тут издеваются, пишут глупости, вместо того, быстро чтобы выдать готовый код под отчёт? :-) Пишут "сначала опишите алгоритм", прямо ламеры какие то, в сиквеле не разбираются :-)

Александр52
create trigger TR on DATABASE for insert
А такие триггеры бывают?
28 дек 11, 00:41    [11836283]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить