存储过程:存储过程是一组预编译的SQL语句,可以在数据库中存储并重复使用。存储过程可以提高性能、减少网络流量并提高安全性。MSSQL中的存储过程使用T-SQL编写。
触发器:触发器是一种特殊类型的存储过程,它会在数据库中执行某个操作(如INSERT、UPDATE或DELETE)时自动触发。触发器可以用于强制实施业务规则、维护数据完整性等。
在MSSQL中创建存储过程和触发器的示例。在这个示例中,我们将创建一个存储过程,用于在Orders
表中插入新的订单,并创建一个触发器,在插入新订单时检查订单金额是否大于1000。如果大于1000,触发器将在Audit
表中插入一条记录。
Orders
表和Audit
表:CREATE TABLE Orders
(
OrderId INT PRIMARY KEY,
CustomerId INT,
OrderAmount DECIMAL(10, 2)
);
CREATE TABLE Audit
(
AuditId INT PRIMARY KEY IDENTITY,
OrderId INT,
OrderAmount DECIMAL(10, 2),
AuditDate DATETIME
);
CREATE PROCEDURE InsertOrder
@OrderId INT,
@CustomerId INT,
@OrderAmount DECIMAL(10, 2)
AS
BEGIN
INSERT INTO Orders (OrderId, CustomerId, OrderAmount)
VALUES (@OrderId, @CustomerId, @OrderAmount);
END;
CREATE TRIGGER tr_AuditOrder
ON Orders
AFTER INSERT
AS
BEGIN
DECLARE @OrderId INT;
DECLARE @OrderAmount DECIMAL(10, 2);
SELECT @OrderId = OrderId, @OrderAmount = OrderAmount
FROM INSERTED;
IF (@OrderAmount > 1000)
BEGIN
INSERT INTO Audit (OrderId, OrderAmount, AuditDate)
VALUES (@OrderId, @OrderAmount, GETDATE());
END
END;
使用存储过程InsertOrder
插入新的订单,触发器将自动检查订单金额并在需要时将记录插入到Audit
表中。示例:在这个示例中,我们插入了一个金额为1200的订单。由于订单金额大于1000,触发器将在Audit
表中插入一条记录。
EXEC InsertOrder @OrderId = 1, @CustomerId = 1, @OrderAmount = 1200;
这条SQL语句的目的是从INSERTED
临时表中获取OrderId
和OrderAmount
这两个字段的值,并将它们分别赋值给变量@OrderId
和@OrderAmount
。
INSERTED
是一个临时表,它包含了触发器操作所影响的所有插入或更新的行。在这个例子中,触发器是在Orders
表上的AFTER INSERT
操作,所以INSERTED
表将包含所有插入的新行。
SELECT @OrderId = OrderId, @OrderAmount = OrderAmount FROM INSERTED;
语句将从INSERTED
表中选择OrderId
和OrderAmount
字段的值,并将它们分别赋值给变量@OrderId
和@OrderAmount
。这样,在触发器的后续操作中,您可以使用这些变量来访问这些值。
请注意,如果INSERTED
表中有多行,此语句将只返回一行。如果您需要处理多行,请使用游标或其他适当的方法来处理。