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

Откуда:
Сообщений: 458
Здравствуйте... вопрос такой... Мне нужно получить перечень логинов, которые в данный момент включены...
 
        Select loginname
	from syslogins
	where hasaccess = 1

В случае запуска от sa выдает весь перечень... в случае запуска пользователя с ограниченными права только dbo и самого пользователя... так и должно быть... так вот вопрос как сделать так, чтобы пользователь получил весь список из этой таблицы?
без opendatasource... если совет через execute as, то я не понял именно как... попытался создать табличнцю функцию на master, и дать ей execute as self, но как я понял использовать execute as в табличных функция запрещено...
Интересно знать не как выкрутиться.. а как было бы сделать правильно!
Заранее спасибо
20 фев 13, 13:22    [13954352]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sandist
а как было бы сделать правильно!

Зачем рядовому пользователю что-то знать о других логинах ?
20 фев 13, 13:24    [13954381]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
Я хочу осуществить рассылку сообщений для всех логинов, которые включены на данный момент...
                                Select ...........................
					   cast((select count(*)
					         from message
							 where kuda = @idOperator
							   AND priority in (1,2)) as int) as oKol,
					   o.id
				from operator o
				left join our_firms f on o.n_firm = f.n_firm
				inner join (Select loginname
				            from master.dbo.syslogins
				            where hasaccess = 1) s on o.login = s.loginname
				left join (select count(*) as C,loginame
						   from  master.dbo.sysprocesses
	                       where PROGRAM_NAME = 'TRADE'
						   group by loginame
						   having count(*) > 0) sP on sP.loginame = o.login 
				order by Vazhno desc, KolIn desc, Name

по идее мне нужно получить доступ к master.dbo.syslogins и master.dbo.sysprocesses...
сейчас реализовано через opendatasource
inner join (Select loginname
				            from OPENDATASOURCE('SQLOLEDB','Data Source=IP;User  
                                                                               ID=sa;Password=hello').master.dbo.syslogins
				            where hasaccess = 1) s on o.login = s.loginname
				order by Vazhno desc, KolIn desc, Name
20 фев 13, 13:33    [13954474]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
то есть рядовой пользователь может осуществлять рассылку...
20 фев 13, 13:36    [13954512]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Glory
Member

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

В смысле ? Он будет писать код и запускать его ?
20 фев 13, 13:38    [13954530]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
преведенный выше код, это список лиц, кому можно отправлять сообщение, чтобы пользователь мог отправить сообщение нужно знать кому отправлять... этот код написан в ХП которую пользователь запускает, чтобы получить таблицу со списком пользователей кому он может отправить сообщение...
можно проще как сделать так, чтобы пользователь с ограниченными правами получил доступ к master.dbo.syslogins?
20 фев 13, 13:43    [13954574]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sandist
этот код написан в ХП которую пользователь запускает, чтобы получить таблицу со списком пользователей кому он может отправить сообщение...

Почему запуск должен осуществлять именно пользователь ?
Почему не сам сервер под логином с нужными правами ?
20 фев 13, 13:45    [13954601]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
а как это осуществить?
20 фев 13, 13:57    [13954709]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
например, создать job c расписанием
20 фев 13, 14:07    [13954798]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
вы наверное не совсем поняли... эта ХП выдает таблицу, которую я через делфи выдаю на экран... и ее обновляю постоянно... то есть это не разовая операция... обновление этого списка производится всякий раз когда приходит сообщение
20 фев 13, 14:14    [13954848]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Sandist
эта ХП выдает таблицу, которую я через делфи выдаю на экран... и ее обновляю постоянно...

То есть все программы с промежутком в N секунд спамят SQL-сервер запросами вида "exec ХранимаяПроцедура"? Или что-то другое?
20 фев 13, 14:27    [13954942]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sandist
эта ХП выдает таблицу, которую я через делфи выдаю на экран... и ее обновляю постоянно.

Sandist
Я хочу осуществить рассылку сообщений для всех логинов

Определитесь, чего же вы хотите уже.
20 фев 13, 14:39    [13955023]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
да... спамят...
Прога получает с помощью ХП значения и выдает на экран... затем с помощью др ХП осуществляет рассылку...
Да какая разница что должна делать прога... Как пользователю дать доступ к syslogins?
20 фев 13, 14:54    [13955133]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sandist
Как пользователю дать доступ к syslogins?

Права выдать
20 фев 13, 14:55    [13955139]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
а другого пути нет? нельзя ка-нибудь используя execute as?
20 фев 13, 15:00    [13955179]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Sandist,

Если оставаться на такой архитектуре, то, например, так... пусть каждые N секунд запускается джоб, который с правами админа будет выполнять ваш запрос и сохранять результат в таблицу. А клиентские программы пусть спамят сервер запросами "select * from ТаблицаРезультата".
20 фев 13, 15:31    [13955443]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
Я еще поискал, как я понял кроме как opendatasource это никак нельзя реализовать... Поэтому как сказала Glory я создал отдельное соединение и все операции произвожу от имени sa... а в ХП передаю параметром оператора... Спасибо за содействие!
20 фев 13, 17:43    [13956572]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
лолл
Member

Откуда:
Сообщений: 450
Sandist,

если есть права на IMPERSONATE

автор
execute as login='sa'
select loginname
from sys.syslogins
where hasaccess = 1
revert


но лучше ознакомьтесь предварительно с персонализацией.

в противном случае процедуру можно создать с опцией WITH EXECUTE AS 'dbo', например:

автор
create proc p
with execute as 'dbo'
as
select loginname
from sys.syslogins
where hasaccess = 1


тогда все пользователи, имеющие право на выполнение этой процедуры будут видеть полный список логинов, т.к. запрос к системной таблице осуществляется от имени владельца базы, а не от пользователя, вызывающего процедуру.
20 фев 13, 19:16    [13957066]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
лолл
Member

Откуда:
Сообщений: 450
лолл,

конечно это не значит, что надо дать права на IMPERSONATE =) это крайне несекьюрно! используйте второй вариант)
20 фев 13, 19:18    [13957073]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
А где ты предлагаешь создать эту процедуру? Дело в том что syslogins находится в БД master, а я работаю с БД MyBD... Я думаю наследование прав в случае когда дело касается разных БД не срабатывает
22 фев 13, 10:20    [13965216]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sandist
Я думаю наследование прав в случае когда дело касается разных БД не срабатывает

Читайте внимательно хелп
{ EXEC | EXECUTE ] AS <context_specification>
[;]

<context_specification>::=
{ LOGIN | USER } = 'name'
[ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]
| CALLER

LOGIN
Specifies the execution context to be impersonated is a login. The scope of impersonation is at the server level.

USER
Specifies the context to be impersonated is a user in the current database. The scope of impersonation is restricted to the current database.


Так вот логины - это серверный уровень, а не базовый
22 фев 13, 10:23    [13965234]     Ответить | Цитировать Сообщить модератору
 Re: syslogins - получить данные из таблицы  [new]
Sandist
Member

Откуда:
Сообщений: 458
Разобрался! Спасибо вам большое! а то казалось как это могло быть не предусмотрено?!
22 фев 13, 11:56    [13965874]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить