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

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

Нужна наводка.
Можно ли организовать что-то подобное триггеру, срабатывающему на SELECT? Необходимо каждый раз менять значение в строке таблицы при выполнении запроса. Необходима реализация на уровне БД MS SQL Server 2005/2008.

Помогите советом.
30 сен 11, 11:07    [11360301]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Glory
Member

Откуда:
Сообщений: 104751
Aleksey Lomov
Необходимо каждый раз менять значение в строке таблицы при выполнении запроса.

Создайте view с нужным именем и запросом
30 сен 11, 11:08    [11360317]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Glory,

Не понятно, а триггер во view на какое событие вешается в этом случае?
30 сен 11, 14:24    [11362648]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Гавриленко Сергей Алексеевич
Member

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

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

Сообщение было отредактировано: 30 сен 11, 14:35
30 сен 11, 14:35    [11362768]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Гавриленко Сергей Алексеевич,

Пока не понятно. Во View ведь нельзя делать update. О каком изменение значений в таблице тогда может идти речь?
30 сен 11, 14:51    [11362946]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
trew
Гавриленко Сергей Алексеевич,

Пока не понятно. Во View ведь нельзя делать update. О каком изменение значений в таблице тогда может идти речь?
Видимо, об изминении выбираемых значений идет речь.
30 сен 11, 14:58    [11363021]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Гавриленко Сергей Алексеевич,

А, по условию. К примеру, выбирать последнюю запись из какой-то таблицы.
Тогда все ясно.
30 сен 11, 15:00    [11363048]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Ural2
Member

Откуда:
Сообщений: 58
"Аналог триггера для SELECT" - уже достаточно бредово звучит :)
Ищите другое решение. Удачи.
30 сен 11, 15:03    [11363087]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
реализуйте через хранимую процедуру!!!!!
это самый напрашивающийся вариант.
create proc sp_get_clients @params ...
[with ..]
as
begin
 [trigger_logic]

 select * .... --код выборки


end
30 сен 11, 15:48    [11363595]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
за вот это:
sp_get_clients
надо атата...
30 сен 11, 16:00    [11363748]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Ray D,

Объясните почему нельзя создавать процедуры имя которых начинается на sp_ ?
30 сен 11, 16:36    [11364239]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
это префикс для системных хранимок, такие хранимки сначала ищутся в БД master, что а) несколько снижает производительность б) в случае наличия хранимки с таким именем в master (допустим создали там по ошибке), будет вызвана хранимка из master, а не из пользовательской БД, тяжело бывает потом такие ошибки находить.
30 сен 11, 16:46    [11364374]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
ну и плюс зачем вообще такие префиксы давать? чтобы с функциями не путать что ли?
30 сен 11, 16:48    [11364396]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Ray D,

автор
а) несколько снижает производительность б) в случае наличия хранимки с таким именем в master (допустим создали там по ошибке), будет вызвана хранимка из master, а не из пользовательской БД


пункт б) не получается подтвердить.
В Management Studio запускаю процедуру с sp_ (которая есть в master). Т.к. подключение к пользовательской базе и результат тоже из хп пользовательской базы.

и как проверить пункт а) ?
30 сен 11, 17:00    [11364554]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
В боле сейчас написано так:

Creating Stored Procedures (Database Engine) ( ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_1devconc/html/c9464445-38cb-4db7-84bc-1fc0efc55b89.htm )
We recommend that you do not create any stored procedures using sp_ as a prefix. SQL Server uses the sp_ prefix to designate system stored procedures. The name you choose may conflict with some future system procedure. If your application uses nonschema qualified name references and your own procedure name conflicts with a system procedure name, your application will break because the name binds to the system procedure, not your own.
30 сен 11, 17:10    [11364665]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Crimean
Member

Откуда:
Сообщений: 13147
"черезжопный" вариант :)
хранимка, в ней - все действия, на выходе - SELECT
поверх - представление через OPENQUERY
30 сен 11, 17:13    [11364713]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
trew
пункт б) не получается подтвердить.

if object_id('dbo.sp_msforeachtable') is not null
    drop proc dbo.sp_msforeachtable
go    
create procedure dbo.sp_msforeachtable
@command1 nvarchar (1000)
as begin
    select 'Thats'' fake sp_msforeachtable'
end
go
exec sp_msforeachtable 'print ''?'''
exec dbo.sp_msforeachtable 'print ''?'''


Сообщение было отредактировано: 30 сен 11, 17:13
30 сен 11, 17:13    [11364717]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Гавриленко Сергей Алексеевич
В боле сейчас написано так:

Creating Stored Procedures (Database Engine) ( ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_1devconc/html/c9464445-38cb-4db7-84bc-1fc0efc55b89.htm )
We recommend that you do not create any stored procedures using sp_ as a prefix. SQL Server uses the sp_ prefix to designate system stored procedures. The name you choose may conflict with some future system procedure. If your application uses nonschema qualified name references and your own procedure name conflicts with a system procedure name, your application will break because the name binds to the system procedure, not your own.

Ну и плюс:
BOL
A user-defined stored procedure that has the same name as a system stored procedure and is either nonqualified or is in the dbo schema will never be executed; the system stored procedure will always execute instead. The following example demonstrates this behavior.

и даже пример есть ;)
30 сен 11, 17:18    [11364783]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Crimean,

Если можно, приведите простенький пример. На нем понятней, особенно начинающим sql.
30 сен 11, 17:19    [11364794]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Ray D,

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

Решил делать так:
у всех View в конце добавлять _v
у всех процедур - _p
у всех функций табличных _ft
у всех функций скалярных _f

чтобы быстрей находить объекты в базе.

А названия начинаться будут на AN_ (к примеру), чтобы было понятно что это моя работа.
30 сен 11, 17:24    [11364850]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
trew,

Пояснение:
SP_Test заменил на SP_Test1111
А вызвал SP_Test из пользовательской бд.
30 сен 11, 17:26    [11364876]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
Ray D,

:D
ок, каюсь.
30 сен 11, 17:37    [11364961]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
invm
Member

Откуда: Москва
Сообщений: 9823
Crimean
"черезжопный" вариант :)
хранимка, в ней - все действия, на выходе - SELECT
поверх - представление через OPENQUERY

Только вот засада: при таком подходе, все изменения, сделанные в хранимке, откатываются.
+
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2772.0 (X64)   Aug  9 2011 15:12:53   Copyright (c) Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 
use tempdb;
go
exec sp_addlinkedserver @server = N'Loopback',  @srvproduct = N'', @provider = N'SQLNCLI10.1', @datasrc = @@servername;
exec sp_addlinkedsrvlogin @rmtsrvname = N'Loopback', @useself = N'true'

exec sp_serveroption N'Loopback', N'DATA ACCESS', N'true'
exec sp_serveroption N'Loopback', N'RPC', N'true'
exec sp_serveroption N'Loopback', N'RPC Out', N'true'

exec sp_serveroption N'Loopback', N'remote proc transaction promotion', N'true'
go

create table dbo.Test (i int identity);
go

create procedure dbo.spTest
as
begin
 set nocount on;
 
 insert into dbo.Test default values;
 
 select count(*) as cnt from dbo.Test;
end;
go

select * from openquery(Loopback, 'exec tempdb..spTest');
select * from openquery(Loopback, 'exec tempdb..spTest');
go

begin tran;
select * from openquery(Loopback, 'exec tempdb..spTest');
select * from openquery(Loopback, 'exec tempdb..spTest');
commit;
go

drop procedure dbo.spTest;
drop table dbo.Test;
go

exec sp_dropserver @server = N'Loopback';
go
30 сен 11, 22:58    [11366517]     Ответить | Цитировать Сообщить модератору
 Re: аналог триггера для SELECT  [new]
J.d
Member

Откуда: Москва
Сообщений: 691
invm,

о, а вот это оч познавательно =)
3 окт 11, 10:08    [11371934]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить