text: --# thanks to George Papastamatopoulos for submitting this ... and Marko Lahma for
  --# updating it.
  --#
  --# In your Quartz properties file, you'll need to set 
  --# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.MSSQLDelegate
  --#
  --# you shouse enter your DB instance's name on the next line in place of "enter_db_name_here"
  --#
  --#
  --# From a helpful (but anonymous) Quartz user:
  --#
  --# Regarding this error message:  
  --#
  --#     [Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.
  --#
  --#
  --#     I added "SelectMethod=cursor;" to my Connection URL in the config file. 
  --#     It Seems to work, hopefully no side effects.
  --#
  --#		example:
  --#		"jdbc:microsoft:sqlserver://dbmachine:1433;SelectMethod=cursor"; 
  --#
  --# Another user has pointed out that you will probably need to use the 
  --# JTDS driver
  --#
  
  USE [empi]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
  ALTER TABLE [dbo].[QRTZ_TRIGGERS] DROP CONSTRAINT FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
  ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] DROP CONSTRAINT FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
  ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
  ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_CALENDARS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_CALENDARS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_CRON_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_CRON_TRIGGERS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_BLOB_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_BLOB_TRIGGERS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_FIRED_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_FIRED_TRIGGERS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_PAUSED_TRIGGER_GRPS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SCHEDULER_STATE]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_SCHEDULER_STATE]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_LOCKS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_LOCKS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_JOB_DETAILS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_JOB_DETAILS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SIMPLE_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS]
  GO
  
  IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
  DROP TABLE [dbo].[QRTZ_TRIGGERS]
  GO
  
  CREATE TABLE [dbo].[QRTZ_CALENDARS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [CALENDAR_NAME] [VARCHAR] (200)  NOT NULL ,
    [CALENDAR] [IMAGE] NOT NULL
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_CRON_TRIGGERS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [TRIGGER_NAME] [VARCHAR] (200)  NOT NULL ,
    [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL ,
    [CRON_EXPRESSION] [VARCHAR] (120)  NOT NULL ,
    [TIME_ZONE_ID] [VARCHAR] (80) 
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_FIRED_TRIGGERS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [ENTRY_ID] [VARCHAR] (95)  NOT NULL ,
    [TRIGGER_NAME] [VARCHAR] (200)  NOT NULL ,
    [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL ,
    [INSTANCE_NAME] [VARCHAR] (200)  NOT NULL ,
    [FIRED_TIME] [BIGINT] NOT NULL ,
    [PRIORITY] [INTEGER] NOT NULL ,
    [STATE] [VARCHAR] (16)  NOT NULL,
    [JOB_NAME] [VARCHAR] (200)  NULL ,
    [JOB_GROUP] [VARCHAR] (200)  NULL ,
    [IS_NONCONCURRENT] [VARCHAR] (1)  NULL ,
    [REQUESTS_RECOVERY] [VARCHAR] (1)  NULL 
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL 
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_SCHEDULER_STATE] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [INSTANCE_NAME] [VARCHAR] (200)  NOT NULL ,
    [LAST_CHECKIN_TIME] [BIGINT] NOT NULL ,
    [CHECKIN_INTERVAL] [BIGINT] NOT NULL
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_LOCKS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [LOCK_NAME] [VARCHAR] (40)  NOT NULL 
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_JOB_DETAILS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [JOB_NAME] [VARCHAR] (200)  NOT NULL ,
    [JOB_GROUP] [VARCHAR] (200)  NOT NULL ,
    [DESCRIPTION] [VARCHAR] (250) NULL ,
    [JOB_CLASS_NAME] [VARCHAR] (250)  NOT NULL ,
    [IS_DURABLE] [VARCHAR] (1)  NOT NULL ,
    [IS_NONCONCURRENT] [VARCHAR] (1)  NOT NULL ,
    [IS_UPDATE_DATA] [VARCHAR] (1)  NOT NULL ,
    [REQUESTS_RECOVERY] [VARCHAR] (1)  NOT NULL ,
    [JOB_DATA] [IMAGE] NULL
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [TRIGGER_NAME] [VARCHAR] (200)  NOT NULL ,
    [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL ,
    [REPEAT_COUNT] [BIGINT] NOT NULL ,
    [REPEAT_INTERVAL] [BIGINT] NOT NULL ,
    [TIMES_TRIGGERED] [BIGINT] NOT NULL
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [TRIGGER_NAME] [VARCHAR] (200)  NOT NULL ,
    [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL ,
    [STR_PROP_1] [VARCHAR] (512) NULL,
    [STR_PROP_2] [VARCHAR] (512) NULL,
    [STR_PROP_3] [VARCHAR] (512) NULL,
    [INT_PROP_1] [INT] NULL,
    [INT_PROP_2] [INT] NULL,
    [LONG_PROP_1] [BIGINT] NULL,
    [LONG_PROP_2] [BIGINT] NULL,
    [DEC_PROP_1] [NUMERIC] (13,4) NULL,
    [DEC_PROP_2] [NUMERIC] (13,4) NULL,
    [BOOL_PROP_1] [VARCHAR] (1) NULL,
    [BOOL_PROP_2] [VARCHAR] (1) NULL,
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_BLOB_TRIGGERS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [TRIGGER_NAME] [VARCHAR] (200)  NOT NULL ,
    [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL ,
    [BLOB_DATA] [IMAGE] NULL
  ) ON [PRIMARY]
  GO
  
  CREATE TABLE [dbo].[QRTZ_TRIGGERS] (
    [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
    [TRIGGER_NAME] [VARCHAR] (200)  NOT NULL ,
    [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL ,
    [JOB_NAME] [VARCHAR] (200)  NOT NULL ,
    [JOB_GROUP] [VARCHAR] (200)  NOT NULL ,
    [DESCRIPTION] [VARCHAR] (250) NULL ,
    [NEXT_FIRE_TIME] [BIGINT] NULL ,
    [PREV_FIRE_TIME] [BIGINT] NULL ,
    [PRIORITY] [INTEGER] NULL ,
    [TRIGGER_STATE] [VARCHAR] (16)  NOT NULL ,
    [TRIGGER_TYPE] [VARCHAR] (8)  NOT NULL ,
    [START_TIME] [BIGINT] NOT NULL ,
    [END_TIME] [BIGINT] NULL ,
    [CALENDAR_NAME] [VARCHAR] (200)  NULL ,
    [MISFIRE_INSTR] [SMALLINT] NULL ,
    [JOB_DATA] [IMAGE] NULL
  ) ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_CALENDARS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_CALENDARS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [CALENDAR_NAME]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_CRON_TRIGGERS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_FIRED_TRIGGERS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [ENTRY_ID]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_PAUSED_TRIGGER_GRPS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [TRIGGER_GROUP]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_SCHEDULER_STATE] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [INSTANCE_NAME]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_LOCKS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_LOCKS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [LOCK_NAME]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_JOB_DETAILS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [JOB_NAME],
      [JOB_GROUP]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_SIMPLE_TRIGGERS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_SIMPROP_TRIGGERS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_TRIGGERS] WITH NOCHECK ADD
    CONSTRAINT [PK_QRTZ_TRIGGERS] PRIMARY KEY  CLUSTERED
    (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    )  ON [PRIMARY]
  GO
  
  ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD
    CONSTRAINT [FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
    (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    ) REFERENCES [dbo].[QRTZ_TRIGGERS] (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    ) ON DELETE CASCADE
  GO
  
  ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD
    CONSTRAINT [FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
    (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    ) REFERENCES [dbo].[QRTZ_TRIGGERS] (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    ) ON DELETE CASCADE
  GO
  
  ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD
    CONSTRAINT [FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
    (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    ) REFERENCES [dbo].[QRTZ_TRIGGERS] (
      [SCHED_NAME],
      [TRIGGER_NAME],
      [TRIGGER_GROUP]
    ) ON DELETE CASCADE
  GO
  
  ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD
    CONSTRAINT [FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] FOREIGN KEY
    (
      [SCHED_NAME],
      [JOB_NAME],
      [JOB_GROUP]
    ) REFERENCES [dbo].[QRTZ_JOB_DETAILS] (
      [SCHED_NAME],
      [JOB_NAME],
      [JOB_GROUP]
    )
  GO
  
  if (object_id('trigger_sys_user_off_online', 'trigger') is not null)
  	drop trigger trigger_sys_user_off_online
  go
  create trigger trigger_sys_user_off_online
  on sec_user_online after delete
  as
  	--定义变量
  	declare @user_id bigint, @id varchar(255), @host varchar(255), @user_agent varchar(255), @system_host varchar(255), @start_timestamp datetime2(7), @last_access_time datetime2(7);
  	select @user_id=user_id, @id=id, @host=host, @user_agent=user_agent, @system_host=system_host, @start_timestamp=start_timestamp, @last_access_time=last_access_time from sec_user_online; 
  	if (@user_id is not null)
  	begin
  		if (not exists(select USER_ID from sec_user_last_online where user_id=@user_id))
  			insert into sec_user_last_online(user_id, uid, host, user_agent, system_host, last_login_timestamp, last_stop_timestamp, login_count, total_online_time) values(@user_id, @id, @host, @user_agent, @system_host, @start_timestamp, @last_access_time, 1, DATEDIFF(s, @start_timestamp, @last_access_time));
  		else
  			update sec_user_last_online set uid=@id, host=@host, user_agent=@user_agent, system_host=@system_host, last_login_timestamp=@start_timestamp, last_stop_timestamp=@last_access_time, login_count=login_count + 1, total_online_time=total_online_time + DATEDIFF(s, @start_timestamp, @last_access_time) where user_id = @user_id;
  	end
  go
  --set nocount on;
  