索引视图:
一般视图都虚表,即视图本身不存储数据,而且是一个查询,当访问视图时,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)
SQL Server 中的DDL触发器
DDL触发器可以在整数据库范围内对对象的定义、修改、删除而触发执行的触发器 。可以数据库级别对数据库对象进行控制和审记 。或者服务器级别的触发器,如用户登录的审记 。
DDL触发器事件定义:
- <EVENT_INSTANCE>
- <EventType>typeEventType>
- <PostTime>date-timePostTime>
- <SPID>spidSPID>
- <ServerName>nameServerName>
- <LoginName>nameLoginName>
- <UserName>nameUserName>
- <DatabaseName>nameDatabaseName>
- <SchemaName>nameSchemaName>
- <ObjectName>nameObjectName>
- <ObjectType>typeObjectType>
- <TSQLCommand>commandTSQLCommand>
- EVENT_INSTANCE>
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