Подтвердить что ты не робот

Журнал запросов SQL Server для неудачных/неправильных запросов?

Я использую SQL Server 2008, и мне хотелось бы узнать, есть ли способ найти недопустимые SQL-запросы, которые были выполнены в базе данных. Например:

SELECT * FROM NonExistingTable

... где база данных не существует или SELECT/INSERT/UPDATE с неправильным синтаксисом.

4b9b3361

Ответ 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;