详解SQL Server中DDL触发器和索引视图

数据库 SQL Server
本文将为大家讲解的是SQL Server中DDL触发器和索引视图,希望对大家了解DLL触发器有所帮助。

索引视图:

一般视图都虚表,即视图本身不存储数据,而且是一个查询,当访问视图时,SQL SERVER会自动根据视图的定义来访问基表数据。具有***的聚集索引的视图,

索引视图本身会存储数据,可以加快查询速度,但会增加数据修改的开销。所以索引视图适用的修改少而查询多的表。创建索引视图时,索引视图的***个索引

 

必须是CLUSTERED和UNIQUE。

索引视图的创建:

 

CREATE TABLE dbo.t1  
(  
USERID VARCHAR(50),   
USERNAME VARCHAR(256)  
);  
go  
CREATE TABLE dbo.t2  
(  
USERID VARCHAR(50),   
DepartID VARCHAR(50)  
);  
GO  
CREATE TABLE dbo.t3  
(  
DepartID VARCHAR(50),   
DepartName VARCHAR(256)  
);  
GO  
CREATE VIEW dbo.USERINFO  
WITH SCHEMABINDING  
AS 
SELECT a.USERID, a.USERNAME, c.DEPARTID, c.DEPARTNAME   
FROM dbo.t1 a, dbo.t2 b, dbo.t3 c   
WHERE a.USERID = b.USERID   
AND b.DEPARTID = C.DEPARTID  
GO  
CREATE UNIQUE CLUSTERED INDEX IX_USERINFO_USERIDDEPARTID ON dbo.USERINFO(USERID, DEPARTID) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

SQL Server 中的DDL触发器

DDL触发器可以在整数据库范围内对对象的定义、修改、删除而触发执行的触发器。可以数据库级别对数据库对象进行控制和审记。或者服务器级别的触发器,如用户登录的审记。

DDL触发器事件定义:

<EVENT_INSTANCE> 
    <EventType>type</EventType> 
    <PostTime>date-time</PostTime> 
    <SPID>spid</SPID> 
    <ServerName>name</ServerName> 
    <LoginName>name</LoginName> 
    <UserName>name</UserName> 
    <DatabaseName>name</DatabaseName> 
    <SchemaName>name</SchemaName> 
    <ObjectName>name</ObjectName> 
    <ObjectType>type</ObjectType> 
    <TSQLCommand>command</TSQLCommand> 
</EVENT_INSTANCE> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

 

 

DDL触发器的创建:

 

CREATE TABLE dbo.t4  
(  
USERNAME VARCHAR(256),   
TSQL VARCHAR(MAX),  
CDATE DATETIME  
);  
GO  
CREATE TRIGGER tr_dbDDL  
ON DATABASE   
FOR   
DROP_TABLE, ALTER_TABLE, CREATE_TABLE,   
CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE  
AS 
DECLARE @xdata XML;  
SELECT @xdata  = EVENTDATA();  
ROLLBACK;  
INSERT INTO dbo.t4(USERNAME, TSQL, CDATE)  
SELECT @xdata.value('(/EVENT_INSTANCE/UserName)[1]''nvarchar(max)'AS dbUserName,   
@xdata.value('(/EVENT_INSTANCE/TSQLCommand)[1]''nvarchar(max)'AS T_SQL,   
GETDATE() AS CDATE;  
 
GO  
use master  
go  
 
CREATE TABLE dbo.t5  
(  
USERNAME VARCHAR(256),   
TSQL VARCHAR(MAX),  
CDATE DATETIME  
);  
GO  
ALTER TRIGGER tr_svrddl  
ON ALL SERVER  
FOR   
CREATE_DATABASE, ALTER_DATABASE, DROP_DATABASE,   
DDL_LOGIN_EVENTS   
AS 
DECLARE @xdata XML;  
SELECT @xdata  = EVENTDATA();  
 
 
INSERT INTO dbo.t4(USERNAME, TSQL, CDATE)  
SELECT @xdata.value('(/EVENT_INSTANCE/LoginName)[1]''nvarchar(max)'AS dbUserName,   
@xdata.value('(/EVENT_INSTANCE/TSQLCommand)[1]''nvarchar(max)'AS T_SQL,   
GETDATE() AS CDATE;  
GO 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.

 

【编辑推荐】

  1. SQL Server使用索引实现数据访问优化
  2. SQL Server数据库优化经验总结
  3. 如何使用SQLServer数据库查询累计值
  4. 浅析Oracle和SqlServer存储过程的调试、出错处理
  5. 几段SQLServer语句和存储过程
  6. 50种方法优化SQL Server数据库查询

 

责任编辑:彭凡 来源: ChinaUnix
相关推荐

2010-09-13 17:03:34

sql server触

2011-03-03 09:30:24

downmoonsql登录触发器

2010-06-30 09:36:25

SQL Server

2010-11-12 15:35:55

SQL Server约

2009-04-07 13:56:03

SQL Server触发器实例

2010-07-23 15:26:29

SQL Server

2010-10-19 15:31:40

sql server触

2010-07-16 10:19:31

2010-07-06 14:47:03

SQL Server数

2010-11-08 11:49:24

SQL Server管

2010-10-20 14:34:48

SQL Server触

2010-10-22 11:10:43

SQL Server触

2010-07-19 16:36:13

SQL Server视

2010-07-05 11:09:55

SQL Server触

2011-03-28 10:05:57

sql触发器代码

2010-11-10 13:37:01

SQL Server触

2011-05-19 14:29:49

Oracle触发器语法

2010-09-13 16:39:36

sql server触

2011-09-01 17:35:56

SQL Server DDL语句

2019-10-22 07:50:45

SqlServer数据库触发器
点赞
收藏

51CTO技术栈公众号