Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с USER DEFINED FUNCTION начинающему / 24 сообщений из 24, страница 1 из 1
10.09.2002, 07:13:53
    #32049242
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
MS SQL SERVER 2000.
Такая вот ситуация:
Есть табличка BIBLIOTEKA. Столбцы:CD (здесь и далее CD воспринимать как ID) Title - заголовок, Date_creation - дата создания записи, Creator - идентификацилнный номер пользователя, который создал эту запись, Date_editing - дата редактирования записи, Editor - идентификацилнный номер пользователя, который вносил изменения в эту запись.
По умолчанию в колонке Date_creation стоит getdate(), то есть при создании новой записи он сразу заполняет ячейку датой, (вообще-то не просто getdate(), а stuff(convert(varchar(17),getdate(),113),1,11,convert(varchar(25),getdate(),104)) - чтобы выдавал дату и время в формате 10.09.2002 7:59).
На апдейт у меня написан триггер:

CREATE TRIGGER [EDIT_DATE] ON [dbo].[BIBLIOTEKA]
FOR Update
AS
update BIBLIOTEKA
set Date_editing=stuff(convert(varchar(17),getdate(),113),1,11,convert(varchar(25),getdate(),104))
from BIBLIOTEKA b, inserted i
where b.CD=i.CD.

Есть вторая табличка MY_BASE_USERS
В ней столбцы: ID_USER, LogName, LastName,SecondName. В ней хранится список пользователей которых я допустил к работе с базой. (Вношу этот список вручную).

С этим я справился. Затем встала задача вносить при соответствующих действиях пользователей их номера в соотв. колонки.

То есть я примерно представляю, что надо наверное написать UserDefinedFunction, в к-рой с помощью функций user или system_user или session_user (кстати не понял в чем их отличие) взять информацию об пользователе, делающему операцию Insert или Update с первой таблицей, проверить есть ли такой пользователь во второй таблице и если да, то взять его идентифик.номер. Если нет, ласково отправить к сисадмину. Затем я эту UDF должен по идее впихнуть как default value в колонку Creator, чтобы при создании туда его впихивала. А в триггере на апдейт тоже добавить эту функцию, чтобы впихивала ID пользователя (не системный ID а мой, из моей таблички) в колонку Editor.

Очень прошу помочь начинающему, волею судеб столкнувшемуся с SQL SERVER 2000.
...
Рейтинг: 0 / 0
10.09.2002, 10:08:30
    #32049276
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
Написать функцию не проблема. Нужна ли она вам? Почему не обойтись стандартными средствами сиквела для раздачи прав?
...
Рейтинг: 0 / 0
10.09.2002, 10:18:18
    #32049283
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
У меня сделано так.
Работает с интегратед секурити.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE FUNCTION GETUSER()
RETURNS int
AS
BEGIN
	RETURN (SELECT id 
	FROM employees
	WHERE login = SUSER_SNAME())
END

Адаптируй под свою структуру.
system_user - логин в SQL.
user - пользователь в БД.
...
Рейтинг: 0 / 0
10.09.2002, 12:37:51
    #32049339
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
(вообще-то не просто getdate(), а stuff(convert(varchar(17),getdate(),113),1,11,convert(varchar(25),getdate(),104)) - чтобы выдавал дату и время в формате 10.09.2002 7:59).

Хм, если у вас поля Date_creation и Date_editing имеют тип datetime, то к чем такие манипуляции ?

А в остальном согласен с GreenSunrise. Если пользователь уже имеет права на INSERT/UPDATE таблицы, то зачем еще раз проверять их наличие ?
...
Рейтинг: 0 / 0
12.09.2002, 10:05:00
    #32049908
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
ну помогите написать процедурку(не UDF, перепутал выше), плиз - вообще не разбираюсь в TSQL
...
Рейтинг: 0 / 0
12.09.2002, 10:42:53
    #32049930
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE get_user
	@user int = NULL OUTPUT
AS
	SELECT @user = GETUSER()
	IF @user IS NULL
		RAISERROR ('Не удаётся определить текущего пользователя. Обратитесь к администратору системы.',  16 ,  1 )
GO

Хотя функция удобней, просто сделай Creator NOT NULL DEFAULT GETUSER()
...
Рейтинг: 0 / 0
12.09.2002, 11:16:11
    #32049950
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
2GreenSunrise
Что такое "сиквела"?
...
Рейтинг: 0 / 0
12.09.2002, 11:33:04
    #32049965
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
Не много не так, Надо вот какую задачу решить:

В первую таблицу вносится новая запись в колонкуТайтл (варчар). Здесь должна сработать процедурка, или триггер, взять командой session_user имя пользователя, поискать его в ДРУГОЙ ТАБЛИЦЕ, и если он там есть, то взять в этой таблице его идентификационный номер (колонка ID_USER) и внести этот номер в колонку Creator (int) в ПЕРВОЙ ТАБЛИЦЕ. То есть как организовать проверку того, что мне вернет функция Session_user с тем что есть в таблице MY_BASE_USERS, если есть, то взять соответствующий номер из колонки ID_USER и впихнуть его в первую таблицу
...
Рейтинг: 0 / 0
12.09.2002, 12:03:59
    #32049985
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
2 3JIA9I CyKA:
Подразумевалось, что раздаем права на те или иные объекты в базе конкретным пользователям или группам пользователей и обходимся без второй таблицы вообще. Или я неправильно понимаю ваш вопрос?
...
Рейтинг: 0 / 0
12.09.2002, 12:14:32
    #32049989
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
то KleFF
А я что, не это написал?
Что, не додуматься как заменить
employees на MY_BASE_USERS
id на ID_USER
и добавить поле login в таблицу MY_BASE_USERS в которое прописать логины, соотв. юзерам?
...
Рейтинг: 0 / 0
12.09.2002, 17:42:47
    #32050228
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
хорошо, я написал UDF, а как ее вызвать? Или как этот алгоритм впихнуть в триггер? Че-то у меня у самого не получается.
Есть триггер на апдейт таблицы - он вставляет дату и время, а еще надо вставить номер того кто вставил. Можно ли из триггера вызвать UDF?или хранимую процедуру? что-то у меня не получается
...
Рейтинг: 0 / 0
12.09.2002, 20:25:16
    #32050270
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
как вызвать UDF
...
Рейтинг: 0 / 0
12.09.2002, 21:36:12
    #32050274
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
Ну написал я процедуру USER_CD, когда в QA пишу exec user_CD он мне возвращает правильный номер. А как теперь применить эту процедуру, чтобы при инсерте или апдейте в соответствующие колонки вносил этот номер. к-рый получает процедура?
В триггере как прописать? Подскажите, очень надо побыстрее оформить все это.
...
Рейтинг: 0 / 0
12.09.2002, 22:21:48
    #32050278
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
В триггере как прописать?

Так же как в QA

declare @myuserid int
exec dbo.user_CD @retuserid=@myuserid OUT

и потом
UPDATE mytable SET reg_user_id = @myuserid
FROM mytable INNER JOIN inserted ON ....
...
Рейтинг: 0 / 0
13.09.2002, 12:06:14
    #32050387
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
2GreenSunrise
Вы меня не поняли. Что такое "сиквела" (или "сиквел")?
...
Рейтинг: 0 / 0
13.09.2002, 12:31:26
    #32050393
akuz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
хорошо, я написал UDF, а как ее вызвать?
Так же как и системную функцию, только dbo. перед ней поставить.

Или как этот алгоритм впихнуть в триггер?
Код: plaintext
1.
UPDATE mytable SET reg_user_id = dbo.GETUSER()
FROM mytable INNER JOIN inserted ON ....
...
Рейтинг: 0 / 0
13.09.2002, 13:00:01
    #32050402
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
2 3JIA9I CyKA:
классно - люди о своем, мы - о своем... "сиквел" = SQL. произносится так, чтобы язык не ломать. ЭсКуЭль - не всякий выговорит :-)
...
Рейтинг: 0 / 0
13.09.2002, 13:11:57
    #32050407
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
И не непишет? Пальцы сломает?
Почему не "свекла"? А DDL как будет?
...
Рейтинг: 0 / 0
13.09.2002, 13:17:32
    #32050411
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
2 3JIA9I CyKA
ну зачем так придератся к девушке.....
...
Рейтинг: 0 / 0
15.09.2002, 11:35:09
    #32050604
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
to Glory and akuz

FROM mytable INNER JOIN inserted ON .... - что писать после многоточия? Просто я еще не очень разбираюсь в грамматике сиквела...
Эти записи мне добавлять в уже существующий триггер? или прописать новый? То есть я добавляю в мой триггер на апдейт это все:
CREATE TRIGGER [EDIT_DATE] ON [dbo].[BIBLIOTEKA]
FOR Update
AS
update BIBLIOTEKA
set Date_editing=stuff(convert(varchar(17),getdate(),113),1,11,convert(varchar(25),getdate(),104))
from BIBLIOTEKA b, inserted i
where b.CD=i.CD.
UPDATE BIBLIOTEKA SET editor= dbo.GETUSER()
FROM BIBLIOTEKA INNER JOIN inserted ON ....

и че ставить после многоточия?
...
Рейтинг: 0 / 0
15.09.2002, 12:20:40
    #32050605
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
хорошо, у меня все получилось
CREATE TRIGGER [EDIT_DATE] ON [dbo].[BIBLIOTEKA]
FOR Update
AS
update BIBLIOTEKA
set Date_editing=stuff(convert(varchar(17),getdate(),113),1,11,convert(varchar(25),getdate(),104))
from BIBLIOTEKA b, inserted i
where b.CD=i.CD.
UPDATE BIBLIOTEKA SET editor= dbo.GETUSER()
FROM BIBLIOTEKA INNER JOIN inserted ON BIBLIOTEKA.CD=inserted.CD

Правильно сделал?
проверил, вроде все работает правильно. Теперь проблема в другом - на инсерт надо сделать такой-же триггер, но на инсерт срабатывает триггер вышеприведенный, то есть на апдейт который.

Вот триггер на инсерт

CREATE TRIGGER [INSERT_DATE] ON [dbo].[BIBLIOTEKA]
FOR INSERT
AS
UPDATE BIBLIOTEKA
SET CREATOR= dbo.GETUSER()
FROM BIBLIOTEKA INNER JOIN inserted ON BIBLIOTEKA.CD=inserted.CD

Как сделать чтобы срабатывал только он? а не оба одновременно?
...
Рейтинг: 0 / 0
15.09.2002, 22:51:47
    #32050616
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
не заглядывайте просто так в тему, подскажите решение проблемы
...
Рейтинг: 0 / 0
15.09.2002, 23:40:00
    #32050617
Cat2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
Во-первых, ничего проверять действительно не надо. Надо настроить права пользователей И не надо посылать пользователя к админу. Не он решает, кому можно разрешить вставку-редактирование. Это вопрос должен быть решен руководством ДО подключения пользователя к базе.

Во-вторых, триггер на вставку не нужен совсем. Достаточно в default колонки date_creation указать getdate(), а в CREATOR user_id().

В-третьих, триггер на UPDATE

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TRIGGER [INSERT_DATE] ON [dbo].[BIBLIOTEKA] 
FOR UPDATE 
AS 
UPDATE BIBLIOTEKA 
SET editor= user_id() ,
date_editing=getdate()
FROM BIBLIOTEKA INNER JOIN inserted ON BIBLIOTEKA.CD=inserted.CD


В четвертых, за пять дней можно было бы разобраться и самому.
...
Рейтинг: 0 / 0
16.09.2002, 00:53:00
    #32050618
KleFF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с USER DEFINED FUNCTION начинающему
спасибо, разобрался. Насчет default value в колонках - getdate у меня уже стоял, а getuser() не получалось так как надо было dbo.getuser - теперь заработало. А почему сразу не сделал, как с getdate(), - вычитал в BOL что только вроде системные функции можно туда впихивать, а getuser - это моя UDF.
В общем всем спасибо, тема закрыта.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с USER DEFINED FUNCTION начинающему / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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