PHP: вставка с использованием sqlsrv pdo с использованием триггеров - PullRequest
2 голосов
/ 06 апреля 2011

Я использую драйвер sqlsrv pdo (использовал версии 5.2 и 5.3) и вижу то, что считаю непреднамеренным поведением.Надеюсь, я что-то не так делаю.

Я создал 2 таблицы в SQL Express 2008. Одна ( Locations ) - это таблица первичных ключей, используемая совместно с другими таблицами.Другая таблица ( Комнаты ) имеет 2 (или более) столбца ... ключевой столбец, связанный как внешний ключ с первой таблицей и одним (или более) столбцами данных.Вот так это выглядит:

Locations

LocationID int
1
2
3
4
5

Номера

LocationID int, Roomname varchar (50)
2, «жилой»
4, «обеденный»

2,4 обе ссылки обратно на таблицу Locations.

Затем я создаю уникальное ограничение для столбца Roomname:

ALTER TABLE Rooms ADD CONSTRAINT UniqueRoom UNIQUE (Roomname)

Затем я создал INSTEADТриггер OF INSERT для таблицы Rooms :

CREATE TRIGGER [dbo].[Rooms_INSERT] 
on [dbo].Rooms 
INSTEAD OF INSERT 
as 
BEGIN 
 INSERT INTO dbo.Locations DEFAULT VALUES 
 INSERT INTO dbo.Rooms select @@IDENTITY, Roomname from inserted    
END  

Теперь я могу вставлять данные в таблицу комнат с помощью:

INSERT INTO Rooms VALUES (null, 'roomname')

Я использую объект sqlsrv PDO длявставка данных через PHP:

$db = new PDO("sqlsrv:server=$serverName;Database=db", "", "");

$sql=("insert into Rooms values (null,?)");
$dbobj = $db->prepare($sql);
if($dbobj->execute(array("dining")))
    print "<p>insert successful</p>";
else
    print "<p>insert unsuccessful</p>";

Начиная с приведенного выше списка таблиц, я получаю следующие результаты:

  • Измените оператор вставки на "вставить в значения Rooms (?)" -терпит неудачу как ожидалось, потому что это ожидает два аргумента, "вставка неудачна".
  • Вернуть оператор вставки в нормальное состояние, попытка вставить массив ("спальня") - успешно выполнено, как и ожидалось, "вставить успешно."
  • Повторно попытаться вставить массив ("спальня") - дБвставка не удалась, ни в одной из таблиц не было выполнено ни одной записи, но сообщается, что попытка успешна, "вставка успешна".

Почему 3-я попытка считается успешной, если в базу данных не было внесено длительных записей?Или, более конкретно, как я могу изменить либо мой PHP, либо мой SQL, чтобы правильно определять, когда такая вставка завершается неудачно из-за нарушения уникального ограничения?

...