CREATE EVENT SESSION MyTableChanges ON SERVER ADD EVENT sqlserver.sp_statement_completed (WHERE object_name = 'Client'),执行以后的提示是,消息 25706,级别 16,状态 8,第 1 行 找不到 事件属性或谓词源 "object_name"。
时间: 2024-02-18 14:01:26 浏览: 20
对于SQL Server 2008 R2,没有`object_name`属性。您可以使用`object_id`属性来代替。请尝试以下命令:
```
CREATE EVENT SESSION MyTableChanges ON SERVER ADD EVENT sqlserver.sp_statement_completed (WHERE sqlserver.database_id = DB_ID('YourDatabase') AND sqlserver.object_id = OBJECT_ID('YourSchema.YourTable'))
```
请将`YourDatabase`替换为您要监视的数据库名称,将`YourSchema`替换为您要监视的模式名称,将`YourTable`替换为您要监视的表名称。您还可以根据需要添加其他过滤器,例如`sqlserver.username`以仅捕获特定用户的更改。
相关问题
import java.sql.; public class TableMonitor { public static void main(String[] args) { try { // 加载数据库驱动程序 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // 连接数据库 Connection conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=GD2030", "sa", "root"); // 创建扩展事件会话 Statement stmt = conn.createStatement(); String createSessionSql = "CREATE EVENT SESSION MyTableChanges ON SERVER ADD EVENT sqlserver.sp_statement_completed (WHERE object_name = 'Client')"; stmt.execute(createSessionSql); // 启动扩展事件会话 String startSessionSql = "ALTER EVENT SESSION MyTableChanges ON SERVER STATE = START"; stmt.execute(startSessionSql); // 监听扩展事件会话 String listenSql = "SELECT * FROM sys.fn_xe_file_target_read_file('C:\MyTableChanges.xel', null, null, null)"; PreparedStatement pstmt = conn.prepareStatement(listenSql); ResultSet rs = pstmt.executeQuery(); // 处理扩展事件 while (rs.next()) { String event = rs.getString(1); System.out.println(event); } // 关闭连接 rs.close(); pstmt.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } },这段代码改成使用java8的版本
你需要做以下两个修改来将代码改为 Java 8 版本:
1. 在 `String listenSql` 中将 `\` 替换为 `\\`,因为在 Java 字符串中,`\` 是一个特殊字符需要转义。
2. 在创建连接时,需要使用 Java 8 版本的 JDBC 驱动程序。你可以从 Microsoft 下载中心下载适用于 Java 8 的 Microsoft JDBC 驱动程序。
修改后的代码如下所示:
```
import java.sql.*;
public class TableMonitor {
public static void main(String[] args) {
try {
// 加载数据库驱动程序
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
// 连接数据库
Connection conn = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=GD2030", "sa", "root");
// 创建扩展事件会话
Statement stmt = conn.createStatement();
String createSessionSql = "CREATE EVENT SESSION MyTableChanges ON SERVER ADD EVENT sqlserver.sp_statement_completed (WHERE object_name = 'Client')";
stmt.execute(createSessionSql);
// 启动扩展事件会话
String startSessionSql = "ALTER EVENT SESSION MyTableChanges ON SERVER STATE = START";
stmt.execute(startSessionSql);
// 监听扩展事件会话
String listenSql = "SELECT * FROM sys.fn_xe_file_target_read_file('C:\\MyTableChanges.xel', null, null, null)";
PreparedStatement pstmt = conn.prepareStatement(listenSql);
ResultSet rs = pstmt.executeQuery();
// 处理扩展事件
while (rs.next()) {
String event = rs.getString(1);
System.out.println(event);
}
// 关闭连接
rs.close();
pstmt.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
这样修改后,你就可以在 Java 8 环境中运行这个程序了。
手机注册android.intent.action.BOOT_COMPLETED广播事件,说法正确的是( )
关于手机注册 `android.intent.action.BOOT_COMPLETED` 广播事件,以下说法是正确的:
当设备启动完成后,Android 系统会发送 `android.intent.action.BOOT_COMPLETED` 广播,通知应用程序设备已经启动完成。如果应用程序需要在设备启动完成后执行某些操作,可以注册接收该广播事件,并在接收到该广播后执行相应的操作。
为了接收 `BOOT_COMPLETED` 广播事件,需要在应用程序的清单文件中添加如下代码:
```xml
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
```
上述代码中,`<uses-permission>` 标签用于声明应用程序需要接收 `BOOT_COMPLETED` 广播事件的权限,`<receiver>` 标签用于声明接收该广播事件的广播接收器。在广播接收器的 `onReceive()` 方法中,可以执行设备启动完成后需要执行的操作。
需要注意的是,在 Android 7.0 及以上的版本中,如果应用程序未曾启动过,是不会接收到 `BOOT_COMPLETED` 广播事件的,这是为了保护用户隐私和节省电量。