Как получить имя доменой учетной записи в MS SQL
Возможно ли в запросе получить имя учетки не той от чего имени выполняется запрос, а той под кем залогинены на ПК? С БД работает ПО от единого прописанного пользователя, на столбец повесил триггер и хочу понимать какой юзер выполняет действия, к исходному коду ПО доступа нет.
Отслеживать
Winteriscoming
задан 22 ноя 2016 в 8:23
Winteriscoming Winteriscoming
2,337 1 1 золотой знак 18 18 серебряных знаков 46 46 бронзовых знаков
Насколько я знаю, то если аутентификация на сервер виндовая, то без проблем через suser_sname() . MSDN. Вот статья по именам пользователей MS SQL: technet.microsoft.com/ru-ru/library/ms191126(v=sql.105).aspx
22 ноя 2016 в 8:28
@BlackWitcher дополнил вопрос.
22 ноя 2016 в 8:30
запрос выполняется всегда от имени пользователя базы данных, независимо от пользователя ОС
22 ноя 2016 в 8:32
@Anatol это понятно, я подумал может есть инструмент который определяет пользователя ОС.
22 ноя 2016 в 8:50
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Ответ на ваш вопрос — нет. Штатными средствами — никак.
Логика такая — сервер, это отдельная изолированная сущность, которая знать не знает ничего о том, кто и под каким именем работает на компьютере.
Грубо говоря, для выполнения запросов нужно подключиться к серверу. После подключения вся работа с сервером выполняется от имени того пользователя, который был подключен к серверу.
Сам сервер знает имя и пароль этого пользователя, и не более. Для того, что бы сервер смог вам выдать имя пользователя, который у вас залогинен в операционной системе, MS SQL должен уметь опрашивать на этот счет операционную систему. Но зачем это ему? Так что сервер не умеет опрашивать винду и узнавать какой пользователь там залогинен, ибо как это вообще относится к функциям сервера и базам данных? Никак.
Но есть один момент, когда для подключению к серверу используется механизм аутентификации Windows. В этом случае система аутентификации Windows и MS-SQL взаимодействуют. В этом случае для авторизации на сервере используются учетные данные Windows. И только в этом случае имя пользователя в Windows и на MS SQL Server совпадают.
Но вот уже дальнейшие распределения прав на объекты внутри сервера обеспечиваются самим сервером, вне зависимости от роли учетной записи Windows.
Итого, получаем, что варианты у нас крайне ограничены:
- Подключаться к БД через windows-аутентификацию, тогда имя домена и учетной записи будет передано внутрь сервера. Но это не всегда возможно.
- Передавать серверу имя домена и пользователя из клиента самостоятельно (нужно подумать, каким именно способом). 2а. Можно попробовать заставлять сервер самостоятельно, каждый раз при подключении пользователя выполнять какой-то внешний инструмент (программу), которая получала бы имя пользователя Windows, подключалась к серверу, и записывала бы в отдельную таблицу имя виндового пользователя, который подключился к серверу.
Но п. 2 и 2а сами по себе мне кажутся очень неудобными, громоздкимии кривыми костылями.
Перенос сайта между доменами
Вы решили переименовать свой сайт и выбрали для него новый домен. Чтобы не потерять трафик, добавьте его как дополнительный к текущему в Панели управления. Это можно сделать на странице управления сайтом в разделе «Домены сайта». В таком случае сайт будет открываться по двум именам — старому и новому.
Если нужно полностью отказаться от старого домена, перенесите сайт на новое имя. Для этого, в первую очередь, добавьте домен на ваш аккаунт как отдельный сайт с помощью Панели управления и зарегистрируйте его.
Порядок переноса зависит от конфигурации сайта. Если это набор html-файлов, просто скопируйте их в корневую директорию нового домена. Если для разработки использовалась CMS, потребуется внести изменения в файлы и базу данных.
Перенос базы данных
Вспомните, устанавливали ли вы CMS вручную или с помощью раздела «Установка приложений» в Панели управления? Если вы использовали ПУ, создайте новую базу данных в разделе «Базы данных» и перенесите в нее содержимое старой базы. Если этого не сделать, при удалении старого сайта удалится и база данных — новый сайт перестанет работать.
Перейдите в PhpMyAdmin, кликните на имя БД сайта в левом столбце, нажмите «Экспорт», а затем «Вперед». Дамп сохранится на вашем компьютере.
После этого нужно импортировать дамп в новую базу. Для этого кликните на имя БД в левом столбце PhpMyAdmin, нажмите «Импорт», а затем «Обзор». Найдите скачанный ранее дамп (файл с расширением .sql) на вашем компьютере и нажмите «Вперед». Дождитесь завершения импорта: база данных нового сайта больше не зависит от установленного приложения.
Теперь скопируйте файлы на новый домен.
Перенос файлов
В Файловом менеджере выберите старый домен в выпадающем списке «Переход к сайту», отметьте все содержимое папки public_html и нажмите «Копировать». Перейдите в корневой каталог нового домена, нажмите «Вставить». Эти же действия можно выполнить, подключившись по FTP.
Если вы создавали новую базу данных для сайта, найдите его конфигурационный файл и укажите данные для подключения к БД.
Все почти готово. Осталось изменить записи с именем старого домена в файлах и базе данных.
Замена ссылок
Перед тем, как приступить к замене ссылок, создайте резервную копию в разделе «Сайты» → «Резервные копии» Панели управления. Если что-то пойдет не так, вы сможете быстро восстановить изначальное состояние сайта.
Чтобы найти и заменить все вхождения старого домена в файлах сайта, подключитесь к аккаунту по SSH и выполните команды:
[username@server ~]$ cd domains/new_domain.ru/
[username@server new_domain.ru]$ grep -rl old_domain.ru ./ | xargs sed -i ‘s/old_domain.ru/new_domain.ru/g’
Если в процессе переноса участвует кириллический домен, то перед заменой ссылок необходимо конвертировать его имя в punycode-кодировку. Это можно сделать с помощью команды idn:
[username@server ~]$ idn домен.рф
Результатом выполнения команды будет имя домена в punycode-кодировке:
Используйте его при замене ссылок:
[username@server new_domain.ru]$ grep -rl xn--d1acufc.xn--p1ai ./ | xargs sed -i ‘s/xn--d1acufc.xn--p1ai/new_domain.ru/g’
Для изменения ссылок в БД удобно использовать утилиту Search&Replace DB. Воспользуйтесь SSH, чтобы скачать ее.
Перейдите в корневой каталог сайта: [username@server new_domain.ru]$ cd public_html/ и выполните команду: [username@server public_html]$ git clone https://github.com/interconnectit/Search-Replace-DB/
В браузере перейдите по ссылке: http://domain.ru/Search-Replace-DB/ Заполните поля:
- «replace» – что ищем (старый домен);
- «with» – на что заменяем (новый домен);
- «database name» — название базы данных;
- «username» — имя пользователя базы данных;
- «pass» – пароль пользователя БД.
Нажмите «Test connection» — утилита проверит, правильно ли вы ввели данные для подключения к БД. После проверки станет активна кнопка «Search and Replace». Нажмите ее, и утилита заменит ссылки.
Проверка сайта
Проверьте работу сайта: переходите по разделам, нажимайте на ссылки. Обращайте внимание на отображение картинок, текстов и адреса в строке браузера.
Когда убедитесь, что новый сайт работает верно, обязательно удалите Search&Replace. Для этого в консоли выполните: [username@server public_html]$ rm -rf Search-Replace-DB Также удалить каталог можно с помощью Файлового менеджера или FTP.
Если вы столкнулись с трудностями — обращайтесь в поддержку. Мы поможем разобраться с проблемой или самостоятельно перенесем ваш сайт на новый домен.
Как найти и обратиться к объекту БД Домен / DOMAIN?
Очень мало информации нашел о таких объектах как «домены». Я знаю, что это примерно (маш. перевод: What is domain type in SQL?):
Доменом является определенный пользователем, названный набор значений. Когда вы объявляете столбцы в таблице SQL или параметры для хранимой процедуры, вы можете использовать домен вместо встроенного типа данных SQL, а затем этот столбец или параметр ограничивается значениями, которые удовлетворяют домену.
Занимаясь сейчас анализом спецификаций к системе, встречаю в ней часто объявление доменов. Но по факту, в базе я не вижу их как объекты, либо упоминания в коде.
Отслеживать
51.6k 200 200 золотых знаков 61 61 серебряный знак 242 242 бронзовых знака
задан 19 фев 2020 в 8:30
67 2 2 серебряных знака 8 8 бронзовых знаков
Где вы это взяли? Судя по граматическим ошибкам, это скорее всего машинный перевод.
19 фев 2020 в 10:09
так и есть, когда искал информацию, забрел на сервис Quora
20 фев 2020 в 6:41
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Начнём с термина Домен (domain) в контексте БД, цитирую:
Домен в реляционной модели данных — тип данных, то есть множество допустимых значений.
Этот термин относится более к этапу анализа и дизайна логической модели БД.
В стандарте SQL-92 появилась возможность создать домен предложением CREATE DOMAIN . Но это предложение реализовано только в некоторых СУБД, например, PostgreSQL.
В СУБД Oracle предложение CREATE DOMAIN отсутствует, поэтому вместо термина домен, чаще в ходу термин — ограничение (constraint, contrained data type). Самые часто используемые ограничения (например, по длине, набору символов) реализованны во встроенных типах данных Built-in Data Types.
Как же реализуются заложеные в логической модели данных домены, например — пол персоны, широко известный как МЖ.
Набор данных для тех, кто всё хочет попробовать сам:
insert into person values ('Маша', 'f'); insert into person values ('Паша', 'm'); insert into person values ('Саша', null); insert into person values ('Мики', 'd');
create table person ( name varchar2 (32), gender char (1), constraint chk_gender check (gender in ('f','m')));
В случае вставки недопустимого значения:
ORA-02290: check constraint (DB.CHK_GENDER) violated
Несколько не в ногу со временем, но ранее широко практиковалось хранить допустимые значеия в отдельной таблице:
create table gender (val char (1) primary key); insert into gender select trim (column_value) from xmlTable ('"f","m"'); create table person ( name varchar2 (32), gender char (1), constraint fk_gender foreign key (gender) references gender (val));
В случае вставки недопустимого значения:
ORA-02291: integrity constraint (DB.FK_GENDER) violated — parent key not found
Пользовательский тип данных с ограничением можно будет использовать как в SQL, так и PL/SQL контексте. Хороший пример есть уже в этой теме. Для случая с МЖ:
create or replace type genderType as object ( val char (1), constructor function genderType (val char) return self as result) final / create or replace type body genderType as constructor function genderType (val char) return self as result is begin if val not in ('f','m') then raise_application_error (-20000, 'illegal gender value >'||val||'<'); end if; self.val := val; return; end; end; / declare gender constant genderType := genderType ('d'); begin null; end; /
Как подсчитать уникальные домены из поля адреса электронной почты в MySQL 1 мин для чтения
Вы хотите подсчитать количество доменных имен из поля вашего адреса электронной почты в mysql. Если вы работаете на PHP, вы могли бы легко это сделать, используя функцию explode и подсчитать доменов, но такой способ — очень плохая логика и требует максимального времени на выполнение, когда у вас много данных. Но в MySQL это легко сделать, используя SUBSTRING_INDEX().
SUBSTRING_INDEX() принимает строку с тремя аргументами, разделитель и число. Строка — это источник строки, разделитель для поиска в строке, а параметр числа будет искать разделитель. Если передать отрицательное значение в третьем аргументе, тогда он будет все слева целевого разделителя возвращается функцией SUBSTRING_INDEX().
Мы собираемся привести пример того, как получить уникальный домен из электронных писем.
Таблица электронных писем
+--------+--------------------------+ | id | email | +--------+--------------------------+ | 1 | [email protected] | | 2 | [email protected] | | 3 | [email protected] | | 4 | [email protected] | | 5 | [email protected] | | 6 | [email protected] | +--------+--------------------------+
Запрос mysql: SELECT SUBSTRING_INDEX(email, '@', -1) as domain_name, count(*) as total_emails FROM emails GROUP BY domain_name ORDER BY total_emails DESC
+-----------------+----------------+ | domain_name | total_emails | +-----------------+----------------+ | gmail.com | 3 | | yandex.ru | 3 | +-----------------+----------------+
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.