Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 9, пользовательская функция в качестве вычисляемого поля / 10 сообщений из 10, страница 1 из 1
24.10.2005, 22:08
    #33341352
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
Напоролся на забавную вещь в ASA 9
Код: plaintext
1.
2.
3.
create table user1.t {
  i1 int,
  i2 int compute( f_my_function(i) )
}
Логинимся от имени user1, вставляем в базу, выбираем, все чудесно и замечательно.
Теперь логинимся другим юзером, делаем select и получаем ошибку, мол нету в базе функции user2.f_my_function.
Интересено, это фича или баг? :)
...
Рейтинг: 0 / 0
25.10.2005, 07:15
    #33341490
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
Это от того, что нельзя указать при вызове функции владельца. Мне, например для подобных случаев (select MyFunc() from ....) пришлось делать владельцем всех функций DBO.
...
Рейтинг: 0 / 0
25.10.2005, 07:16
    #33341491
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
Так что скорее всего - это фича.
...
Рейтинг: 0 / 0
25.10.2005, 07:38
    #33341498
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
White OwlНапоролся на забавную вещь в ASA 9
Код: plaintext
1.
2.
3.
create table user1.t {
  i1 int,
  i2 int compute( f_my_function(i) )
}
Логинимся от имени user1, вставляем в базу, выбираем, все чудесно и замечательно.
Теперь логинимся другим юзером, делаем select и получаем ошибку, мол нету в базе функции user2.f_my_function.
Интересено, это фича или баг? :)
Хороший повод помнить, что в таких случаях лучше явное имя владельца писать , даже если он и DBA и права указывать :)

AndynЭто от того, что нельзя указать при вызове функции владельца. Мне, например для подобных случаев (select MyFunc() from ....) пришлось делать владельцем всех функций DBO.
Как это нельзя указать владельца ? Наоборот можно и даже нужно: OwnerName.FuncName() работает везде и всегда :) А вот трогать DBO совсем нежелательно.
...
Рейтинг: 0 / 0
25.10.2005, 11:11
    #33341960
Andyn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
ASCRUSКак это нельзя указать владельца ? Наоборот можно и даже нужно: OwnerName.FuncName() работает везде и всегда :) Гм, похоже это так. Последний раз делал такие функции в ASA 8 и не помню почему, но тогда пришлось сделать их именно для DBO.

А насчет ASCRUSА вот трогать DBO совсем нежелательно. у всех мнение разное. :) Где-то даже наоборот советуют, что все объекты принадлежать DBO.
...
Рейтинг: 0 / 0
25.10.2005, 18:08
    #33343440
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
ASCRUSХороший повод помнить, что в таких случаях лучше явное имя владельца писать , даже если он и DBA и права указывать :)
Ну это то понятно. Но возникает сразу идея сделать две РАЗНЫХ функции принадлежащих разным юзерам/группам и поставим их в качестве формулы для вычислимого поля. В итоге мы можем получить разные, но в обоих случаях правильные варианты таблицы. Для чего это может быть нужно, кроме сведения юзеров с ума? :)
...
Рейтинг: 0 / 0
25.10.2005, 18:12
    #33343451
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
White Owl пишет:

> Ну это то понятно. Но возникает сразу идея сделать две РАЗНЫХ функции
> принадлежащих разным юзерам/группам и поставим их в качестве формулы для
> вычислимого поля. В итоге мы можем получить разные, но в обоих случаях
> правильные варианты таблицы.

Не получим. RTFM. Значения вычислимых полей НЕ ВЫЧИСЛЯЮТСЯ на лету при
каждом select. Они хранятся и пересчитываются при INSERT и UPDATE.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
25.10.2005, 18:21
    #33343482
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
Александр ГoлдунНе получим. RTFM. Значения вычислимых полей НЕ ВЫЧИСЛЯЮТСЯ на лету при каждом select. Они хранятся и пересчитываются при INSERT и UPDATE.
Да, я тоже так думал раньше :)
Но вот практика показывает, что использование пользовательской DETERMINISTIC функции в формуле вычислимого поля работает не совсем так, как описано в документации.
...
Рейтинг: 0 / 0
25.10.2005, 22:20
    #33343766
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
White Owl пишет:

> Да, я тоже так думал раньше :)
> Но вот практика показывает, что использование пользовательской
> DETERMINISTIC функции в формуле вычислимого поля работает не совсем так,
> как описано в документации.

Это можно воспроизвести коротким скриптом? Такие несоответствия не лучше
ошибок. Если это действительно так, то надо слать в Sybase - пусть
исправляют сервер либо документацию
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
25.10.2005, 23:25
    #33343816
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 9, пользовательская функция в качестве вычисляемого поля
Александр ГoлдунЭто можно воспроизвести коротким скриптом?
Да, конечно. Вот пример.

Сначала делаешь как юзер user1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create function user1.f_GetDay(in pDate date) returns numeric( 4 ) deterministic
begin
	return datepart(day, pDate);
end;

create table user1.t(
	d date not null,
	i numeric( 4 ) null compute(f_GetDay(d)),
	userid char( 10 ) null default last user
);
grant select, insert, update on user1.t to user2;

insert into user1.t(d) values(today());
select * from user1.t;
теперь разлогиниваешься и логинишься снова уже как user2:
Код: plaintext
select * from user1.t;
получаешь ошибку, мол нету такой функции.

Раз нету, значит создадим:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create function user2.f_GetDay(in pDate date) returns numeric( 4 ) deterministic
begin
	return datepart(month, pDate);
end;

insert into user1.t(d) values(today());
select * from user1.t;
И тащишься :)

Так что высчитывается оно все таки при вставке, тут я слегка погорячился, но потом еще и проверяет существование функции во время выборки...
Итого, можно делать РАЗНЫЕ варианты вычислимых полей в зависимости от юзера которым добавляешь/обновляешь записи :) Даешь каждому юзеру по собственной функции и получаешь сошедших с ума бухгалтеров :)

проверял на ASA 9.0.2.2451
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 9, пользовательская функция в качестве вычисляемого поля / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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