Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Имя таблицы как параметр запроса   Найти похожие ветки 

 
StriderMan ©   (2006-08-03 19:15) [40]


> И нехрен пользователю их менять

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


 
Petr V. Abramov ©   (2006-08-03 19:34) [41]

> 1. узнаем, есть ли запись со значением поля, которое нам надо выставить в текущей записи.
 А в это время висит транзакция, которая запись с таким значением только что вставила. Т.к. сия транзакция еще не завершена, узнаем, что записи нет.
2. Начинаем действовать исходя из этого. Пока действуем, нехорошая транзакция коммитится.
3. Сильно удивляемся.

 Если кто подумает,что это "маловероятно" - законы Мерфи имеют приоритет над законами больших чисел. Electronically tested, как пишут на презрвативах.


 
Dok   (2006-08-03 19:34) [42]


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

почему нужно уменьшать код?
почему пользователь его вообще меняет?


 
sniknik ©   (2006-08-03 19:48) [43]

> задачи товароучета сложно решать без возможности изменения идентификатора товара (кода, артикула, штрих-кода).
хм...
позвольте поинтересоваться, а вы с 1С знакомы?
если знакомы то должны знать, в 1С поле идентифицирующее запись, не только поменять, посмотреть нельзя... а то что вы видите, и меняете, оно вторично... (потому и можно)


 
Petr V. Abramov ©   (2006-08-03 19:56) [44]

> Dok   (03.08.06 19:34) [42]
> почему пользователь его вообще меняет?
 потому что в общем случае он его вводит и может ошибиться. Системы кодировки могут быть достаточно хитрыми. К примеру, чаще всего выписываемый товар должен иметь короткий и простой код, типа 111, а другие - подлинне.


 
paul_k ©   (2006-08-03 21:43) [45]

Уважаемые господа. просвятите пожалуйста что будет в результате исполнения следующего кода на MsSql сервере и как с этим боротся.
у паблика прав на селект из таблийц нету. есть только на выполнение процедур
есть процедура с кодом
...
declare @t_name varchar(30)
set @t_name = "authors"
exec ("select * from "+@t_name)
....
будет ли она работать под пабликом, у которого нет прав на выборку данных из таблицы authors?


 
paul_k ©   (2006-08-03 21:50) [46]

а будет вот что
SELECT permission denied on object "authors", database "pubs", owner "dbo".

и как с этим правильно жить и работать? права на прямой запрос дать нельзя. все данные выбирать положено только через процедуры


 
Petr V. Abramov ©   (2006-08-03 22:13) [47]

> и как с этим правильно жить и работать?
 я mssql не знаю, но что ты не в ту ветку вопрос задал - уверен :))))


 
Anatoly Podgoretsky ©   (2006-08-03 22:33) [48]

paul_k ©   (03.08.06 21:50) [46]
Попробуй так
declare @t_name varchar(30)
declare @sql varchar(40)
set @t_name = "authors"
set @sql = "select * from "+@t_name
exec (@sql)


 
Petr V. Abramov ©   (2006-08-03 23:49) [49]

> Anatoly Podgoretsky ©   (03.08.06 22:33) [48]
 разница даже мне видна :)))


 
paul_k ©   (2006-08-04 09:41) [50]

> [48] Anatoly Podgoretsky ©   (03.08.06 22:33)

Большое спасибо.Попробовал. и так попробовал и сяк попробовал и наперекосяк... :)))
А смысл перестановки, если в разруливании доступа дело?
предвиху вопрос задача мол идиотская, и нафиг тебе это не нужно
задача получить отчет о рыночной стоимости активов
есть тип актива (валюта, ЦБ, драгметалы, недвижимость)
соответственно есть "котировки" активов лежат в разных таблицах ибо это абсолютно разные сущности
соответсвенно можно писать кучу условий по разным типам активов. Что при добавлении нового типа активов ведет к переписыванию отчета.
А можно добавить настройку вида  [тип актива], [имя таблицы котировок] [имя поля котировки]. И тогда придобавлении нового актива достаточно добавить запись в эту настройку и все.
Но у простого смертноко пользователя правов на запрос не может быть. Политики безопасности, мать их
И что делать? механихм динамического формирования запроса есть а как его применить то?


 
Babay ©   (2006-08-04 10:51) [51]

ТО paul_k ©  
В MS SQL есть такая штука как представление, пользователю даем права на селект из представления и делаем это в процедуре, а в представление пихаем что нужно и как нужно....
Если я все правильно понял это должно тебя спасти....


 
ANB ©   (2006-08-04 12:03) [52]


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

Кто мешает отделить мух от котлет ? Я сам не раз наступал на грабли, когда пытался использовать естественные ключи.

Решение простое - для связок и ПК использовать искуственные ключи, которые генерятся автоматически и пользователь не может их менять (вопрос просмотра - дискуссионный), а внешние коды можно забивать в отдельные поля. И пусть пользователь делает с ними, что хочет. Главное, контролировать их с точки зрения бизнес-логики (например запрет дублей).


 
StriderMan ©   (2006-08-04 12:07) [53]


> sniknik ©   (03.08.06 19:48) [43]
> > задачи товароучета сложно решать без возможности изменения
> идентификатора товара (кода, артикула, штрих-кода).
> хм...
> позвольте поинтересоваться, а вы с 1С знакомы?
> если знакомы то должны знать, в 1С поле идентифицирующее
> запись, не только поменять, посмотреть нельзя... а то что
> вы видите, и меняете, оно вторично... (потому и можно)

Так я и говорю об этом. Разумеется в таблицах есть поле ID которое пользователю недоступно, также как в 1С. Но я говорю о поле код, которое в том же 1С уникально, и доступно пользователю.


 
paul_k ©   (2006-08-04 12:32) [54]

> [51] Babay ©   (04.08.06 10:51)

низя.... Безопасность так построена.


 
jiny   (2006-08-04 14:01) [55]

У меня это все прекрасно работает, пользователей приучил что ID - это уникальный идентификатор, который генерит сервер, и который ни в коем разе нельзя поменять никому, даже мне, также есть поле ID_doc, где также генериться сервером какой-нить номер накладной и которое пользователь может поменять(причем id сделки фиксируется мелким шрифтом на наряде на укомплектацию и на самой накладной, и никому это не мешает), причем чтобы не было путанницы, пользователи всегда ориентируются по номеру сделки (ID), даже если номер накл.изменен


 
stud ©   (2006-08-04 15:34) [56]

StriderMan ©   (04.08.06 12:07) [53]
Так я и говорю об этом. Разумеется в таблицах есть поле ID которое пользователю недоступно, также как в 1С. Но я говорю о поле код, которое в том же 1С уникально, и доступно пользователю.

так если поле код уникальное, что прописано на сервере, в чем проблема что туда будет вводить пользователь? сервер в любом случае дубль не пропустит. и зачем тут предварительные селекты?
а связь по этому коду совсем не нужна, только по внутреннему скрытому от пользователя ид.


 
Sergey13 ©   (2006-08-04 15:41) [57]

Читаю-читаю, и все больше мне задача кажется странной. Кому нафиг нужны коды, которые меняются местами?!!! Сегодня карандаш 13-й, линейка 15-я. Завтра наоборот. Зачем? Или таки я не понял смысла сего.


 
StriderMan ©   (2006-08-04 15:44) [58]


> stud ©   (04.08.06 15:34) [56]
> так если поле код уникальное, что прописано на сервере,
> в чем проблема что туда будет вводить пользователь? сервер
> в любом случае дубль не пропустит. и зачем тут предварительные
> селекты?
> а связь по этому коду совсем не нужна, только по внутреннему
> скрытому от пользователя ид.

Связей по нему и нет. А конкретная проблема при изменении кода описана тут [26], [28].


 
StriderMan ©   (2006-08-04 15:49) [59]


> Sergey13 ©   (04.08.06 15:41) [57]
> Читаю-читаю, и все больше мне задача кажется странной. Кому
> нафиг нужны коды, которые меняются местами?!!! Сегодня карандаш
> 13-й, линейка 15-я. Завтра наоборот. Зачем?

Вобщем-то фича не особенно нужная, но кое-где используется. Дело в том что все запросы в справочники сортируются по коду, и в некоторых случаях сделано так, что берется первая запись, или записи перебираются в порядке кода. Соответственно пользователь меняя код может настроить что будет первым а что последним.


 
ANB ©   (2006-08-04 15:58) [60]


> Связей по нему и нет. А конкретная проблема при изменении
> кода описана тут [26], [28].

И таких табличек, где это нужно делать - не одна, как я понял. Тогда только динамический SQL. Можешь больше тут не спорить.


 
stud ©   (2006-08-04 15:59) [61]

Sergey13 ©   (04.08.06 15:41) [57]
Кому нафиг нужны коды, которые меняются местами?

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

StriderMan ©   (04.08.06 15:44) [58]
Связей по нему и нет. А конкретная проблема при изменении кода описана тут [26], [28].

вот в [26] второй пункт смущает совершенно. т.е. юзер видит ЧТО НА ЧТО он меняет, но если такой уже есть, то никто не знает на какой он изменится (в некоторое свободное значение)???
это что-то из области "угадай мелодию" получается. по идее нельзя изменить существующий код на тот, который уже есть в системе. а если очень хочется - то пускай сначала изменят тот который есть руками.


 
stud ©   (2006-08-04 16:03) [62]

ANB ©   (04.08.06 15:58) [60]
И таких табличек, где это нужно делать - не одна, как я понял.

и связей нет..... т.е. структура на справочники не завязана....


 
Sergey13 ©   (2006-08-04 16:07) [63]

> [61] stud ©   (04.08.06 15:59)

Я говорил не про коды вообще, а про меняющиеся местами коды.
У автора это уже не код, а поле для сортировки получается. А если так - пусть меняет. Мне не жалко. 8-)


 
stud ©   (2006-08-04 16:11) [64]

Sergey13 ©   (04.08.06 16:07) [63]
У автора это уже не код, а поле для сортировки получается

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


 
StriderMan ©   (2006-08-04 16:35) [65]


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

администрирование предполагается централизованное.


> ANB ©   (04.08.06 15:58) [60]
> Можешь больше тут не спорить.

А я и не спорю. Подходящий мне вариант [6].


> stud ©   (04.08.06 15:59) [61]
> вот в [26] второй пункт смущает совершенно. т.е. юзер видит
> ЧТО НА ЧТО он меняет, но если такой уже есть, то никто не
> знает на какой он изменится (в некоторое свободное значение)?
> ??

Читайте внимаетльно и до конца.

для тех кто в танке или просто не понял что нужно:
датасет:
 
 ID/код/ Имя
 111 1  Запись1
>222 2  Запись2  //текущая запись


Пользователь жмет кнопочку (-)
Получаем:


   ID/код/ Имя
>  222 1  Запись2 //текущая запись
   111 2  Запись1  


 
stud ©   (2006-08-04 17:28) [66]

ну так если количество таблиц где нужно провести изменения заранее известно, то достаточно в процедуре реализовать изменение нужных полей во всех таблицах сразу. а в качестве параметров например передавать ид текущей записи которую меняем, старое и новое значения кода.
по крайней мере такой способ будет побыстрее работать чем execute staitment


 
StriderMan ©   (2006-08-04 17:37) [67]


> то достаточно в процедуре реализовать изменение нужных полей
> во всех таблицах сразу

сразу во всех не надо! нужно в конкретной таблице провернуть такую операцию [65]. По полю КОД нет никакой связи в таблицах! в других менять не надо. фишка в том что оно уникальное!
Наиболее близкая задача - это поменять местами два элемента в массиве. такую задачу решают обычно через третью переменную. вот также и тут. коды можно поменять только через некое третье значение.

Короче от темы уже совсем отошли.


 
stud ©   (2006-08-04 17:43) [68]

т.е. у тебя есть просто несколько независимых таблиц - справочников, где есть эти самые коды?
тогда execute поможет конечно, но несколько запросов с клиента побыстрее будет


 
StriderMan ©   (2006-08-04 17:46) [69]


> stud ©   (04.08.06 17:43) [68]

да. именно так.
сейчас работает через DataSet.Edit... Что по сути и есть несколько запросов (использую IBQuery-UpdateObject). Попробую через Execute Stateмent, сравню что быстрее.


 
ANB ©   (2006-08-04 17:55) [70]


> StriderMan ©   (04.08.06 17:46) [69]

Кстати, никто не мешает такой запрос на клиенте собирать.


 
StriderMan ©   (2006-08-04 17:59) [71]


> ANB ©   (04.08.06 17:55) [70]

там несколько запросов. а хотелось одним, чтоб быстрее. а одним - только ХП.


 
ANB ©   (2006-08-04 18:01) [72]


> StriderMan ©   (04.08.06 17:59) [71]

А в оракле есть безымянные блоки, в которые можно много чего написать . . .


 
StriderMan ©   (2006-08-04 18:02) [73]


> ANB ©   (04.08.06 18:01) [72]

что за блоки?

впрочем я под FB пишу..


 
ANB ©   (2006-08-04 18:05) [74]


> что за блоки?

declare
begin
 -- много операторов PL/SQL
end;


 
ANB ©   (2006-08-04 18:06) [75]


> StriderMan ©   (04.08.06 18:02) [73]

Кстати, раз уж пишешь под FB - есть ли в нем аналог NVL или IsNull, чтобы без геморроя нулловые поля сравнивать ?


 
sniknik ©   (2006-08-04 18:08) [76]

> там несколько запросов. а хотелось одним, чтоб быстрее. а одним - только ХП.
только это для MSSQL (!!!) не знаю сработает а файребирде, или нет.

тест

UPDATE Unik
SET No = (SELECT No FROM Unik n WHERE n.ID<>Unik.ID AND (N.ID=1 OR N.ID=2))
WHERE ID=1 OR ID=2

при
CREATE TABLE Unik (ID INT Identity(1, 1) PRIMARY KEY, No INT, Name VarChar(30))

CREATE UNIQUE INDEX No ON Unik (No)


думаю ясно чем заменяются 1 и 2 в реальном запросе. ;)


 
StriderMan ©   (2006-08-04 18:09) [77]


> ANB ©   (04.08.06 18:06) [75]

есть IS NULL. в два слова.


 
StriderMan ©   (2006-08-04 18:16) [78]


> sniknik ©   (04.08.06 18:08) [76]
UPDATE Unik
SET No = (SELECT No FROM Unik n WHERE n.ID<>Unik.ID AND (N.ID=1 OR N.ID=2))
WHERE ID=1 OR ID=2


че-то сомнительно что это прокатит. но попробую. на след. неделе. уже пора закругляться :)



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.041 c
2-1158906189
qp
2006-09-22 10:23
2006.10.08
Build with runtime package - зачем?


1-1156613300
Destroyer
2006-08-26 21:28
2006.10.08
Остановка потока


3-1154497168
Alex35
2006-08-02 09:39
2006.10.08
Пример работы с DTS на Delphi


2-1159078361
ds
2006-09-24 10:12
2006.10.08
Динамика


15-1158179578
Ketmar
2006-09-14 00:32
2006.10.08
что за привычка...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский