С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/48: Рейтинг темы: голосов - 48, средняя оценка - 4.63
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522

Как получить id последней добавленной записи в БД в MSSQL

06.06.2012, 02:59. Показов 9715. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!
Народ, кто-нить знает как получить id последней добавленной записи в БД в MSSQL? Нужен аналог mysql_insert_id() в РНР или LAST_INSERT_ID в MySQL.
Делаю так
SQL
1
INSERT INTO $tb ($columns_s) VALUES ($values_s) SELECT @@IDENTITY AS [ID]
но запрос возвращает номер какого-то ресурса
Code
1
Resource id#28
при настоящем id 100029
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.06.2012, 02:59
Ответы с готовыми решениями:

PRIMERY_KEY последней добавленной записи
Как узнать PRIMERY_KEY (id) последней записи добавленной в таблицу?

Как в MySQL запросе сравнить значение id из таблицы A со значением a_id из таблицы B из последней добавленной записи
Очень тяжело объяснить, вот пример (работаю в phpmyadmin): У меня есть 2 таблицы: articles categories У articles есть...

Получить "id" только что добавленной записи
Доброго времени, в заполяемой запросом таблице есть поле "id", которое устанавливается автоматически. Каким способом, желательно...

5
 Аватар для AllageARH
47 / 47 / 4
Регистрация: 05.06.2009
Сообщений: 122
06.06.2012, 15:52
Триггеры?
1
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899
06.06.2012, 17:22
Вот мож поможет!

Создание триггеров
Цели занятия:
• Изучить возможности, реализуемые с помощью триггеров
• Получить навыки создания триггеров различных типов, использовать таблицы вставки и удаления

Преимущество триггерной процедуры состоит в том, что SQL Server автоматически вызывает ее при обращении к команде, для которой она определена. Это повышает устойчивость базы данных к внешним воздействиям. Вам нет нужды беспокоиться о том, чтобы клиенты базы данных — пользователи или приложения - разбирались и пользовались всеми зависимостями данных и установленными для них правилами.
Триггеры используются для бизнес-правил, которые могут быть реализованы с помощью табличных ограничений. До появления версии SQL Server 2000 триггеры в основном применялись для отслеживания каскадных изменений связанных данных, однако, как мы уже видели, это правило теперь может быть реализовано на табличном уровне. Однако большинство правил, относящихся к взаимодействию нескольких таблиц, такие как вычисление итоговых значений или ограничение значений на основе другой таблицы, как в нашем примере, гораздо проще реализовать через триггеры.


Триггеры AFTER
SQL Server поддерживает два различных типа триггеров: триггеры AFTER и триггеры INSTEAD OF. Триггеры AFTER вызываются после выполнения команды, которой они назначены, а триггеры INSTEAD OF вызываются вместо команды.
Триггеры AFTER вы можете использовать для команд INSERT, UPDATE и DELETE. Триггеры AFTER можно создавать только для таблиц, но не для представлений. Для каждой из этих трех команд может быть установлено несколько триггеров. С другой стороны, один триггер может быть применен для любой комбинации этих трех команд.
Если вы создаете несколько триггеров для одной команды, вы можете использовать системную процедуру sp_settriggerorder для указания первого и последнего по порядку триггера, выполняемого для команды. Триггер AFTER вызывается после того, как выполнены все операции по обработке ограничений низкого уровня, и не будут вызваны в случае нарушения ограничения.
Триггеры INSTEAD OF
Триггеры INSTEAD OF заменяют команду, для которой они объявлены. Подобно триггерам AFTER, вы можете определять триггеры INSTEAD OF для команд INSERT, UPDATE или DELETE. Один триггер может быть применен к нескольким командам.
Однако, в отличие от триггеров AFTER, вы можете создавать триггеры INSTEAD OF как для таблиц, так и для представлений, но для каждого действия над этой таблицей или представлением может быть создан только один триггер INSTEAD OF.
Триггеры INSTEAD OF несовместимы с каскадными изменениями связанных данных. Вы не можете объявить триггер INSTEAD OF DELETE или INSTEAD OF UPDATE для таблицы, внешний ключ которой затрагивается действиями удаления (DELETE) или модификации (UPDATE).
Поскольку триггеры INSTEAD OF могут быть объявлены для представлений, они чрезвычайно полезны для получения функциональных возможностей представления, которые не могут быть доступны иным способом. Например, SQL Server не дает возможности применить для представления оператор INSERT, содержащий фразу GROUP BY, но позволяет вам определить триггер INSTEAD OF INSERT для представления. Вы можете воспользоваться триггером для вставки записей в таблицы, лежащие в основе представления, тем самым давая знать пользователю, что новая строка была вставлена в представление.
Триггеры BEFORE
Триггера BEFORE не существует, но триггер INSTEAD OF может порождать команду, для которой он объявлен, и эта команда будет выдаваться, как если бы триггера INSTEAD OF не было.
Например, если вы хотите проверить некое условие до выполнения команды INSERT, вы можете объявить триггер INSTEAD OF INSERT. Триггер INSTEAD OF будет выполнять проверку, а затем выполнять команду INSERT для таблицы. Оператор INSERT будет выполняться обычным образом, не порождая рекурсивных вызовов триггера INSTEAD OF.
Создание триггеров
SQL Server накладывает ряд ограничений на действия, выполняемые триггерами. Вы не можете создавать (командой CREATE), изменять (командой ALTER) или удалять (командой DROP) базу данных с использованием триггера; вы не можете восстанавливать базу данных или файл журнала; вы не можете выполнять определенные операции, которые изменяют конфигурацию SQL Server. (Если вас интересует полный перечень «запрещенных» команд, обратитесь к документации SQL Server Books Online.)
Если вы с помощью триггера меняете параметры базы данных, изменение будет действовать только на время выполнения триггера; после этого параметру будет возвращено его оригинальное значение.
Теоретически вы можете использовать оператор RETURN для возврата значения из триггера, но вы не можете полагаться на то, что клиентскому приложению известно о существовании триггера и на то, какие действия он выполняет. Обычно в таких случаях лучше использовать команду RAISERROR, поскольку в большинстве разрабатываемых приложений предусмотрена возможность обработки таких ошибок.
Как и любые другие объекты базы данных, триггер определяется с помощью соответствующей формы оператора CREATE. Базовый синтаксис оператора создания триггера следующий:
MySQL
1
2
3
4
CREATE TRIGGER имя_триггера
ON таблица_или_представление
тип_триггера, список_команд AS
onepaтор_SQL
Имя_триггера должно удовлетворять правилам, принятым для идентификаторов. Таблица_или_представление может быть именем представления, только если тип_триггера есть INSTEAD OF, поскольку только этот тип триггера вы можете определять для представлений. Триггеры не могут быть созданы для временных или системных таблиц, но они могут ссылаться на временные таблицы.
Тип__триггера должен быть выражен одним из ключевых слов AFTER, FOR или INSTEAD OF, в то время как список_команд может быть любой комбинацией команд INSERT, UPDATE или DELETE. Если вы указываете более одной команды, их следует отделять запятыми.
Ранние версии SQL Server поддерживали только триггеры AFTER и использовали ключевое слово FOR в качестве типа_триггера. Данный синтаксис по-прежнему поддерживается SQL Server 2000, но он будет означать то же самое, что триггер AFTER.
Onepamopы_SQL, следующие за ключевым словом AS, определяют действия, выполняемые триггером. Здесь имеется аналогия с хранимыми процедурами, за исключением того, что триггеры не имеют параметров.

Пример. Создание триггера AFTER
Для проверки работы триггера должна быть создана таблица TriggerMessages с полями TriggerName типа varchar (50) и MessagesText - varchar (100). Затем выполнен запрос:
MySQL
1
2
3
4
5
6
CREATE TRIGGER afterUpdate
ON Customer
AFTER UPDATE
AS
INSERT INTO TriggerMessages (TriggerName, MessagesText)
VALUES (‘afterUpdate’,’Триггер afterUpdate завершил работу’)
После изменений в таблице Customers в таблице TriggerMessages можно увидеть результат.

Пример. Создание триггера INSTEAD OF
MySQL
1
2
3
4
5
6
CREATE TRIGGER insteadOf
ON Customer
INSTEAD OF UPDATE
AS
INSERT INTO TriggerMessages (TriggerName, MessagesText)
VALUES (‘insteadOf’,’Триггер insteadOf завершил работу’)
В этом примере также используется таблица TriggerMessages, где после изменений в таблице Customers можно увидеть результат работы триггера.
Триггеры можно создавать и редактировать в Enterprise Manager. Для этого нужно открыть таблицу в режиме конструктора (Design Table) и на панели инструментов нажать кнопку Triggers.

Функция UPDATE
SQL Server предоставляет специальную функцию, UPDATE, которая может быть использована в триггере для определения, подвергся ли изменению определенный столбец в строке. Функция UPDATE имеет следующий синтаксис:
UPDATE (имя_ столбца)
Функция UPDATE будет возвращать TRUE, если значения данных для указанного столбца были изменены командой INSERT или командой UPDATE.
Другая функция Transact-SQL, COLUMNS_UPDATED, возвращает битовую маску, биты которой устанавливаются в единицу для тех столбцов, которые были модифицированы. Функция COLUMNS_UPDATED может оказаться более эффективной, чем функция UPDATE, если вам необходимо проверить статус нескольких столбцов.

Пример. Использование функции UPDATE
MySQL
1
2
3
4
5
6
7
8
9
10
CREATE TRIGGER UpdateFunc
ON Employees
AFTER UPDATE
AS  
IF UPDATE (LastName)
    INSERT INTO TriggerMessages (TriggerName, MessagesText)
    VALUES (‘UpdateFunc’,’Изменили LastName’)
IF UPDATE (Address)
    INSERT INTO TriggerMessages (TriggerName, MessagesText)
    VALUES (‘UpdateFunc’,’Изменили Address’)
Таблицы вставки и удаления
SQL Server создает две таблицы, облегчающие манипулирование данными при применении триггеров. Таблицы вставки и удаления представляют собой временные резидентно хранящиеся в памяти таблицы, которые содержат строки, подвергшиеся воздействию команды, вызвавшей триггер. Они называются INSERTED и DELETED.
Если триггер вызывается из команды DELETE, таблица удаления будет содержать строки, которые были удалены из таблицы. При вызове из команды INSERT таблица вставки будет содержать копию новых (вставляемых) строк. Физически оператор UPDATE представляет собой последовательное выполнение команды удаления DELETE и вставки INSERT, так что таблица удаления будет содержать старые значения, а таблица вставки - новые. Вы можете обращаться к содержимому этих таблиц из триггера, но вы не можете изменять их.
Напомним, что триггеры AFTER не вызываются до тех пор, пока не будет осуществлена модификация таблицы, т.е. строки в исходных таблицах уже подвергнутся изменениям. С другой стороны, триггер INSTEAD OF вызывается вместо действия, для которого он определен, поэтому таблица еще не будет изменена. Фактически таблица вообще не будет изменена, если команда INSTEAD OF не назначит соответствующие команды.
Триггер вызывается для команды, а не для строки. Вам следует проявлять осторожность при написании триггеров, затрагивающих несколько строк (в случае их наличия) в таблицах вставки и удаления. Глобальная переменная @@ROWCOUNT будет возвращать количество записей в этих таблицах, если вы обратитесь к ней в начале описания вашего триггера.

Пример. Использование таблицы удаления
MySQL
1
2
3
4
5
6
7
8
9
10
CREATE TRIGGER DeleteFunc
ON Products
AFTER DELETE
AS  
IF NOT EXISTS (SELECT name FROM sysobjects
    WHERE name=’Arch’ AND type=’U’)
CREATE TABLE Arch(ProductID int, ProductName varchar(100), CategoryID int)
INSERT INTO Arch (ProductID, ProductName, CategoryID)
    SELECT ProductID, ProductName, CategoryID
    FROM DELETED
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.06.2012, 01:48  [ТС]
AllageARH, речь идет о MSSQL.
Макc, спасибо, много информации. Не мог ты написать запрос который выводит последнюю строку из таблицы. Не понимаю почему такая важная вещь в MSSQL делается ч/з Ж.
0
 Аватар для allukard
307 / 218 / 70
Регистрация: 08.11.2010
Сообщений: 1,899
07.06.2012, 08:26
вот блин азадачили! так так сам я нуб в этом деле, ну пробнем

создаем триггер

T-SQL
1
2
3
4
5
6
CREATE TRIGGER afterUpdate
ON Customer
AFTER UPDATE
AS
SELECT MAX(id) FROM Customer
INSERT INTO TriggerMessages (MessagesText) VALUES (’тут запилить id’)
вот как поместить в таблице максимальный Идентифкатор! в php эт легло а тут....
1
11 / 11 / 4
Регистрация: 01.02.2011
Сообщений: 111
07.04.2014, 14:34
теме уже 2 года... но прочитав не мог не написать ответ, а то может быть вы до сих пор используете триггеры и не используете @@IDENTITY
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2014, 14:34
Помогаю со студенческими работами здесь

Как узнать id только что добавленной записи mysqli?
Всем привет! Записываю данные в БД. Надо узнать id этой записи, т.е. id только что вставленной записи. В БД у id стоит auto_increment. ...

Как получить номер последней добавленной записи?
Есть база данных на Access (возможно потом будет перенесено на MSSQL). Как при добавлении новой записи в таблицу получить ее номер? (id...

Как получить индекс последней добавленной записи
Как получить последний добавленный индекс? Добавлено через 11 секунд Почему нельзя использовать SELECT MAX(ID)?

Как вычленить из cmd.CommandText отдельные элементы? Как получить id последней добавленной записи?
private void btn_Add_Click(object sender, EventArgs e) { con.Open(); OleDbCommand cmd =...

Как вернуть Id последней добавленной записи
cmd.ExecuteNonQuery(); возвращает количество задействованных строк. Есть ли команда возвращающая задействованные строки.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru