如何为Microsoft SQL Server创建此触发器?

时间:2010-11-10 01:46:38

标签: sql-server tsql

我有这个限制我必须实现服务器端(在数据库中)。通常我会在客户端这样做,但我想为什么不学习服务器方面。 :P

如果他们不满18岁,我不希望我的客户能够从XXX类型中租借电影。

以下是我用来生成表格的脚本:

-- =============================================
-- Sergio's Lab Tests MWA HA HA
-- =============================================

use AlquilerPeliculas

create table Client
(
    ID int primary key not null identity(1,1),
    Address nvarchar(1024) not null,
    Phone nvarchar(256) not null,
    NIT nvarchar(32) not null
)
go
create table Genre
(
    ID int primary key not null identity(1,1),
    Name nvarchar(256)
)
go
create table Movie
(
    ID int primary key not null identity(1,1),
    Name nvarchar(256) not null,
    IDGenre int foreign key references Genre(ID)
)
go    
create table Natural
(
    IDCliente int primary key references Cliente(ID),
    Age as datediff(d, FechaDeNacimiento,getdate())/365.00,


    Nombre nvarchar(1024) not null,
    ApellidoPaterno nvarchar(512) not null,
    FechaDeNacimiento datetime,
    Sexo varchar(1) not null check(Sexo='M' or Sexo='F')
)
go
create table Alquiler
(
    ID int primary key not null identity(1,1),
    FechaDeAlquiler datetime,
    Total nvarchar(20) not null,
    IDClient int foreign key references Client(ID)
)
go
create table Ejemplar
(
    ID int primary key not null identity(1,1),
    NumeroDeEjemplar nvarchar(256) not null,
    Descripcion nvarchar(1024),
    IDFormato int foreign key references Formato(ID),
    IDPelicula int foreign key references Pelicula(ID)
)
go
create table DetalleAlquiler
(
    ID int primary key not null identity(1,1),
    IDEjemplar int foreign key references Ejemplar(ID),
    IDAlquiler int foreign key references Alquiler(ID),
    PrecioDeAlquiler nvarchar(128),
    FechaDevolucion datetime,
    FechaDevolucionProgramada datetime
)

我问了一个朋友我应该使用什么,他说了一个触发器,但我的理解是触发器是一个在满足触发条件时运行的功能,对吗?如果我使用了触发器,我必须插入然后删除一个顽皮的记录吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

阅读有关triggers here

的所有信息

它们有多种口味,它们可以在每次插入之前/每次更新后运行,依此类推。触发器的触发是一揽子操作,如果你有一个BEFORE触发器,它将始终运行。

然后,如果要进行任何过滤或错误处理,例如,如果特定列具有特定值,则只运行一些代码,将其包含在触发器内(在条件代码中)。

一般来说,我建议不要使用触发器,它们通常会使锁定更加复杂,并且“隐藏”在没有人倾向于看的地方(这使得它们很难调试)。

您可以采用DB方式的另一种方法,它具有您调用的特定存储过程,而不是直接调用表,例如:spRentMovie。