Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Microsoft SQL Server

Автор: mdid
Дата сообщения: 09.11.2009 14:32
sql server 2008

Код:
select t.*,Top(1) v.* from TBofGoodsIncoming as t
LEFT JOIN valuation as v ON t.id_документа=v.id_документа AND t.ТМЦ=v.ТМЦ
where t.id_документа=53 order by v.Дата desc ,v.Время desc
Автор: counsellor
Дата сообщения: 09.11.2009 15:49
Естественно не будет работать. Почитайте BOL, что ли. Или хорошую книжку по SQL...

Попробуйте так:

Код: select t.*, v.*
from TBofGoodsIncoming as t
outer apply (select top 1 valuation where id_документа = t.id_документа and ТМЦ = t.ТМЦ order by v.Дата desc, v.Время desc) as v
where t.id_документа = 53
Автор: mdid
Дата сообщения: 09.11.2009 19:04

Код:
select t.*, v.*
from TBofGoodsIncoming as t
outer apply (select top 1 * from valuation where id_документа = t.id_документа and ТМЦ = t.ТМЦ order by Дата desc, Время desc) as v
where t.id_документа = 54
Автор: shadow_user777
Дата сообщения: 22.01.2010 16:58
Имеется БД.
Подключение юзера осуществляется стандартно - логин\пасс.
Если юзер подключился с логином qwert и пассом 123456, то изменив регистр букв в логине а именно логин QWERT и пасс 123456, он может ПОВТОРНО зайти в БД.
Т.е. 1 логин - 2 коннекта.
Как можно с этим поборотся?
MsSQL 2000
Автор: counsellor
Дата сообщения: 22.01.2010 17:24
Более того, ему необязательно менять регистр букв. Юзер с логином qwert и пассом 123456 может зайти в БД сколько угодно раз одновременно, если специально не бороться с этим.
Автор: shadow user777
Дата сообщения: 22.01.2010 20:31
counsellor
Интересует как раз таки запрет таких "заходов".
Как это можно реализовать?

В дополнение - юзеры заходят удаленно, т.е. разные ИП. Может чем поможет ....
Проблема стоит ребром
Автор: dneprcomp
Дата сообщения: 22.01.2010 21:04
shadow user777 counsellor

Запрет можно организовать достаточно легко. На каждый login проверяем таблицу входящих логинов. Если не нашли, заносим новый. На выходе очищаем таблицу от текущего логина.
Можно еще порыться в направлении SQL Server 2000 Auditing
Но audit для данной задачи черезмерно. Даже если и можно там что-то найти для логинов.
Автор: shadow user777
Дата сообщения: 22.01.2010 21:15
Тут еще заковыка в том что софт которым коннектится юзер, без исходников.
Т.е. предпринять что либо в софтине, невозможно.
Остается только что то придумать в самой MSSQL.
Триггер команду SELECT не держит
Автор: dneprcomp
Дата сообщения: 22.01.2010 21:28
shadow user777
Юзер же что-то делает в базе при входе. Какие-то stored procedure работают, функции...
Вот на первое действие(вернее перед ним) и поставить

PS.Поищи Logon Triggers
Автор: shadow_user777
Дата сообщения: 23.01.2010 08:30
Ммм, оказалось все сложнее....
Программа юзает при подключении к БД не логон а запрос вида SELECT.
Т.е. в БД, в таблице, содержатся данные о логинах паролях и характеристиках аккаунтов. При коннекте юзер селектит свои данные в программу.


Добавлю.
При коннекте в таблице статуса коннекта 0 сменяется на 1.
При повторном коннекте похоже что туда же снова записывается 1 и все.
Может с этим можно что-то сотворить?
Автор: dneprcomp
Дата сообщения: 23.01.2010 18:43
shadow_user777

1.Логон должен быть по любому. Иначе как сервер знает кому отсылaть данные? И кому записывать 1.
2.
Цитата:
При коннекте в таблице статуса коннекта 0 сменяется на 1
Cтатус сменяется для конкретного логина? Тогда попробовать что-нибуть с instead тригером.

Forcefully Disconnect All Users and Drop a Database

[more=kill all processes on the server]create procedure spKillUsers
@dbName varchar(32)

as
declare @spid smallint
declare @cmd varchar(32)

create table #tmp

(spid smallint,
status varchar(32),
loginame varchar(32),
hostname varchar(32),
blk char(8),
dbname varchar(32),
cmd varchar(255))

declare cLogin cursor for select spid from #tmp where dbname = @dbName

insert into #tmp exec sp_who

open cLogin
fetch cLogin into @spid

while @@fetch_status = 0
begin
select @cmd = 'kill ' + CONVERT(char, @spid)
print @cmd
execute( @cmd )
fetch cLogin into @spid
end

close cLogin
deallocate cLogin
go
GRANT EXECUTE ON dbo.spKillUsers TO public
go
[/more]

[more=Procedure to forcibly disconnect users from a database]
http://www.wisesoft.co.uk/Articles/SQL%20Server/sp_killusers.doc

Procedure to forcibly disconnect users from a database
About
This stored procedure will take the name of a database and disconnect all the users from the database. Any pending transactions will be rolled back. Please use this function with caution.
    The procedure creates a temporary table and stores the results of the sp_who system function in the temporary table. A cursor is created to select the SPID column from the temporary table where the dbname column is equal to the @database parameter submitted to the function. Dynamic SQL is generated to run the KILL statement for each SPID connected to the specified database. A check is made to ensure that the KILL statement is not run for the current user’s connection.
T-SQL Code (SQL 2000)

create procedure sp_killusers(@database varchar(30))
as
----------------------------------------------------
-- * Created By David Wiseman, Updated 03/11/2006
-- * Version for SQL 2000
-- * http://www.wisesoft.co.uk
-- * This procedure takes the name of a database as input
-- * and uses the kill statment to disconnect them from
-- * the database.
-- * PLEASE USE WITH CAUTION!!
-- * Usage:
-- * exec sp_killusers 'databasename'
----------------------------------------------------
set nocount on
-- Create temp table to store results of sp_who
create table #who
(
spid int,
ecid int,
status varchar(30),
loginname varchar(35),
hostname varchar(15),
blk int,
dbname varchar(30),
cmd varchar(30)
)
declare @spid int
declare @killstatement nvarchar(10)
-- Run sp_who to get the users connected to each database
insert into #who exec sp_who
-- Declare a cursor to select the users connected to the specified database
declare c1 cursor for select spid from #who where dbname = @database
open c1
fetch next from c1 into @spid
-- for each spid...
while @@FETCH_STATUS = 0
begin
    -- Don't kill the connection of the user executing this statement
    IF @@SPID <> @spid
    begin
        -- Construct dynamic sql to kill spid
        set @killstatement = 'KILL ' + cast(@spid as varchar(3))
        exec sp_executesql @killstatement
        -- Print killed spid
        print @spid
    end
    fetch next from c1 into @spid
end
-- Clean up
close c1
deallocate c1
drop table #who

T-SQL Code (SQL 2005)


create procedure [dbo].[sp_killusers](@database varchar(30))
as
----------------------------------------------------
-- * Created By David Wiseman, Updated 19/11/2006
-- * Version for SQL 2005
-- * http://www.wisesoft.co.uk
-- * This procedure takes the name of a database as input
-- * and uses the kill statment to disconnect them from
-- * the database.
-- * PLEASE USE WITH CAUTION!!
-- * Usage:
-- * exec sp_killusers 'databasename'
----------------------------------------------------
set nocount on
declare @spid int
declare @killstatement nvarchar(10)

-- Declare a cursor to select the users connected to the specified database
declare c1 cursor for select request_session_id
from sys.dm_tran_locks
where resource_type='DATABASE'
AND DB_NAME(resource_database_id) = @database
open c1
fetch next from c1 into @spid
-- for each spid...
while @@FETCH_STATUS = 0
begin
-- Don't kill the connection of the user executing this statement
IF @@SPID <> @spid
begin
-- Construct dynamic sql to kill spid
set @killstatement = 'KILL ' + cast(@spid as varchar(3))
exec sp_executesql @killstatement
-- Print killed spid
print @spid
end
fetch next from c1 into @spid
end
-- Clean up
close c1
deallocate c1
[/more]
Автор: AviDen
Дата сообщения: 05.03.2010 18:58
shadow_user777
Попробуй заюзать след. схему:
1. Вешаешь триггер на изменение поля статуса в таблице аккаунтов, в котором
1.1. Определяешь список активных сессий, залогиненных под тем же логином, например, таким запросом:

Код: select * from sysprocesses where loginame=(select suser_sname()) and spid != @@SPID
Автор: VGreen
Дата сообщения: 01.04.2010 09:00
в шапочке поправьте
SQL Server 2005 Books Online
http://download.microsoft.com/download/3/D/9/3D956EA9-F211-4E66-929D-3431F8617127/SqlServer2K5_BOL_Jan2009_ru-RU.msi
Автор: billwet
Дата сообщения: 01.04.2010 12:31
Вопрос. А можно ли запросом узнать IP-адреса компа (сервак) и как?
Все перерыл, не нашел. Может не там рыл?
Автор: volser
Дата сообщения: 01.04.2010 14:03
billwet
Гугл отключили? Ссылка
Автор: apnss
Дата сообщения: 10.04.2010 19:31
есть 2005 экспресс

табличка с самосоединением PTypeID -> TypeID

пример данных:



Возникла необходимость сделать серверную функцию возвращающую конечные листы этого дерева напр.: выборка по коду TypeID = 2 должна вернуть 20101, 20102, 202

как проще и продуктивнее реализовать рекурсию на MS SQL 2005 ?

Добавлено:

RTFM: BOL, WITH обобщенное_табличное_выражение

не все так страшно как казалось

вот может кому пригодится:


Код: IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'dbo.GetChildTypes') and xtype in (N'FN', N'IF', N'TF'))
DROP FUNCTION dbo.GetChildTypes
GO
CREATE FUNCTION dbo.GetChildTypes(@TypeID int)
RETURNS @out TABLE(TypeID int, PTypeID int, TypeName varchar(50), FileType varchar(10)) AS
BEGIN
WITH GetTypes(TypeID, PTypeID, TypeName, FileType) AS
(
SELECT TypeID, PTypeID, TypeName, FileType FROM types WHERE TypeID = @TypeID
UNION ALL
SELECT E.TypeID, E.PTypeID, E.TypeName, E.FileType FROM types E INNER JOIN GetTypes D ON E.PTypeID = D.TypeID
)
INSERT INTO @out
SELECT TypeID, PTypeID, TypeName, FileType FROM GetTypes WHERE FileType IS NOT NULL
RETURN
END
Автор: Hrist
Дата сообщения: 12.04.2010 10:52
поставил 2003 R2 + SQL 2000 для 1С 7.7
ось и скуль видят 12гб озу и 8 ядер проца
НО - даже при перепроведении всей базы (а она за несколько лет уже более 15гигов)
занимается только одно ядро проца под 100% и 1.7гб оперативы и все
в скуле поставлено использовать все ядра и 10гб оперативы
в чем же тогда проблема?????
Автор: counsellor
Дата сообщения: 12.04.2010 11:28
Проблема в 1С. Она использует базу SQL как DBF, т.е. тупо выкачивает все данные на клиентскую машину и там считает
Автор: Hrist
Дата сообщения: 12.04.2010 11:46
counsellor
вы серьезно? ТАКОГО я от нее даже и не ожидал

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

но что бы грузила данные на клиентскую машину? скуль ей отдаст их не выполнив запроса на обработку?
впрочем я понял так что в таск манаджере и смотреть не стоит - врет он при работе скуля - буду смотреть перформанце и под загрузкой уже реальной со всеми пользователями - картина может измениться кардинально
Автор: counsellor
Дата сообщения: 12.04.2010 11:57
Увы и ах. Она ещё при перепроведении переводит базу в однопользовательский режим, так что даже забэкапить её нельзя. Ставьте 1С на сервер и перепроводите с него - максимальная скорость будет.

Цитата:
скуль ей отдаст их не выполнив запроса на обработку


А в чём проблема?

Код: SELECT * FROM table
Автор: SIgor33
Дата сообщения: 19.04.2010 12:21
Возник такой вопрос при изпользовании full search можно ли сделать так чтобы при получение словоформы были не только та часть речи которая в запросе но и ее производные?
Например задаю слово сталь получаем на выходе:
сталь, сталью, стали т.е существительное с падежами а хотелось бы еще
стальной,стальным прилогательные
и глаголы и наречие
Автор: AviDen
Дата сообщения: 19.04.2010 18:22
Hrist

Цитата:
поставил 2003 R2 + SQL 2000 для 1С 7.7
ось и скуль видят 12гб озу и 8 ядер проца
НО - даже при перепроведении всей базы (а она за несколько лет уже более 15гигов)
занимается только одно ядро проца под 100% и 1.7гб оперативы и все
в скуле поставлено использовать все ядра и 10гб оперативы
в чем же тогда проблема?????


Проблема известно в чём - в архитектуре 1С. SQL Server хоть и видит 8 ядер, но тем не менее каждый клиентский запрос обрабатывает (как правило) только в одном рабочем потоке (ну, за редкими исключениями, когда запрос распределён по разным файлам/базам и его, может быть, можно как-то распараллелить). А один поток = одно ядро. Т.е. на бОльшем количестве ядер сиквелл лучше работает с несколькими пользователями, но линейная скорость выполнения запросов особо не растёт.

P.S. А вот с этого места: "в скуле поставлено использовать ... 10гб оперативы" попрошу поподробнее. У вас 64-битная редакция SQL Server? Если нет, то какими выкрутасами добились? Неужто AWE?
Автор: No_Need
Дата сообщения: 24.11.2010 19:19
Добрый вечер.
Подскажите подалуйста. есть dbml файл с описанием базы данных. таблицы, типы, функции...
Как мне с его помощью создать базу данных? Порылся, мало чего нашел... Перспектива забивать все ручками не радует....
C помощью утилиты sqlmetal получил файл C#, но как им сделать базу тоже не представляю...
Заранее спасибо.... sql 2005, vs2008
Автор: SIgor33
Дата сообщения: 25.11.2010 09:39
No_Need
посмотри здесь там есть утилита
http://msdn.microsoft.com/ru-ru/library/bb546179.aspx
Автор: No_Need
Дата сообщения: 25.11.2010 09:44
sqlmetal и есть... она к сожалению создат только dbml -файлы из базы, но не наоборот... покрайней мере ключа такого я не нашел..
буду рад если ткнете носом...
Автор: SIgor33
Дата сообщения: 25.11.2010 10:49
No_Need
Извини я ложанулся. Действительно Вы правы.
Я обычно для переноса базы создаю sql script
Автор: No_Need
Дата сообщения: 26.11.2010 18:05
Увы остался только dbml файл)
Автор: BlackVetal
Дата сообщения: 29.11.2010 05:36
No_Need
Насколько помню - где-то находил что есть софтинка, которая по dbml может создать скрипт для создания структуры таблиц, при этом она не сможет создать ключи и индексы - про них нет инфы в dbml ...
Мне кажется проще руками все воссоздать ...
Автор: klimusu
Дата сообщения: 30.11.2010 22:10
делаю выборку из двух баз (в обоих случаях это count(x), т.е. получаю целое число) на сервер sql. но оказывается что у них разные колейшены.
Cannot resolve the collation conflict between "Cyrillic_General_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

можно как-то это обойти без смены коллейшена базы\сервера?
Автор: volser
Дата сообщения: 30.11.2010 23:15
Ссылка
Ссылка
Ссылка

Страницы: 1234567891011121314151617181920212223242526272829

Предыдущая тема: Генератор 10-ти разрядных ключей


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.