Журнал запросов SQL Server для неудачных/неправильных запросов?
Я использую SQL Server 2008, и мне хотелось бы узнать, есть ли способ найти недопустимые SQL-запросы, которые были выполнены в базе данных. Например:
SELECT * FROM NonExistingTable
... где база данных не существует или SELECT/INSERT/UPDATE
с неправильным синтаксисом.
Ответы
Ответ 1
SQL Server не хранит журнал этих вещей, поэтому, если вы хотите их захватить, вам придется сделать это, используя трассировку на стороне сервера с фильтром, чтобы отображать только сообщения с ошибками. Это будет довольно дорогая трассировка, и вы получите ложные срабатывания, если вы сделаете что-то вроде RAISERROR WITH NOWAIT
... Я думаю, это проще, чем реализовать TRY
/CATCH
всюду и самостоятельно регистрировать ошибки?
Могут быть способы сделать это с помощью SQL Server Audit (в зависимости от вашей версии)
или Расширенные события, но я не пробовал делать эту конкретную вещь с помощью...
Ответ 2
Запись сообщения 229 строгости 14 определенно поможет вам определить, когда происходят эти ошибки.
SELECT * FROM master.sys.messages
WHERE language_id=1033
AND severity=14
AND message_id=229;
Вы можете включить его, используя:
EXEC sp_altermessage 229, 'WITH_LOG', 'true';
Я бы создать предупреждение по ошибкам Severity 14, которые будут уведомлены, когда они произойдут, для этого вам также нужно будет установить оператора.
Единственное ограничение, которое это имеет, заключается в том, что оно не дает вам имени входа, имени хоста или IP-адреса сеанса с ошибкой. Он регистрирует SPID, и вам нужно будет извлечь его, используя EXEC xp_readerrorlog, используя что-то вроде
EXEC xp_readerrorlog 0,1,'permission',NULL,NULL,NULL,'desc'
или открыть его в SSMS, а затем сопоставить его с тем, что вы найдете на sysprocesses, используя
SELECT * FROM master.dbo.sysprocesses WHERE SPID='LoggedSPID'
Вы можете включить ведение журнала других сообщений, о которых вы, возможно, захотите узнать, для этой цели, прежде всего, выровнять по степени серьезности 14 и включить по мере необходимости.
SELECT * FROM master.sys.messages
WHERE language_id=1033
AND severity=14;